entity frameworkCodeFirst与其他信息的多对多关系
我有以下型号:
class Contract { string ContractID{get;set;} ICollection Parts{get;set;} } class Part { string PartID{get;set;} ICollection Contracts{get;set;} }
问题是Part和Contract之间的关系还包含以下附加信息:
class ContractParts { Contract{get;set;} Part{get;set;} Date{get;set;} //additional info Price{get;set;} //additional info }
我将如何为此编写实体上下文?
在这种情况下,您必须以这种方式为实体建模:
public class Contract { public virtual string ContractId { get; set; } public virtual ICollection ContractParts { get; set; } } public class Part { public virtual string PartId { get;set; } public virtual ICollection ContractParts { get; set; } } public class ContractPart { public virtual string ContractId { get; set; } public virtual string PartId { get; set; } public virtual Contract Contract { get; set; } public virtual Part Part { get; set; } public virtual string Date { get; set; } //additional info public virtual decimal Price { get; set; } //additional info }
在派生上下文中,您必须定义:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasKey(cp => new { cp.ContractId, cp.PartId }); modelBuilder.Entity() .HasMany(c => c.ContractParts) .WithRequired() .HasForeignKey(cp => cp.ContractId); modelBuilder.Entity() .HasMany(p => p.ContractParts) .WithRequired() .HasForeignKey(cp => cp.PartId); }
也许更好的方法是这个答案? 使用关联表中的其他字段首先创建代码,多对多创建代码
它不需要流畅的API,也可以在连接表上设置PK。