如何在entity framework中创build多对多映射?
在这种情况下,我有两个实体,比如Contract,Media。
public class Media : Entity { public string Name {get; set;} public bool Enabled *//other properties can be ignored..* } public class Contract : Entity { public string Code {get; set;} *//other properties can be ignored..* }
合同有很多媒体,看来他们是多对多的。
但!! 在ef代码第一,我需要在ContractMedia表中的3个字段(如自动生成)。 如StartDate,EndDate和Price。 这些不能被添加到Media实体中。
如何在这种情况下映射?
如果要在关联表中创build与附加数据的多对多关系,则必须将关联表作为实体。 纯多对多的关系只是在纯表中用实体标识的。
在你的情况下,将是:
public class Media // One entity table { public int Id { get; set; } public string Name { get; set; } public bool Enabled { get; set; } public virtual ICollection<ContractMedia> ContractMedias { get; set; } } public class Contract // Second entity table { public int Id { get; set; } public string Code { get; set } public virtual ICollection<ContractMedia> ContractMedias { get; set; } } public class ContractMedia // Association table implemented as entity { public int MediaId { get; set; } public int ContractId { get; set; } public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } public double Price { get; set; } public virtual Media Media { get; set; } public virtual Contract Contract { get; set; } }
在创build模型/实体之后,您需要在上下文中定义关系:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<ContractMedia>() .HasKey(c => new { c.MediaId, c.ContractId }); modelBuilder.Entity<Contract>() .HasMany(c => c.ContractMedias) .WithRequired() .HasForeignKey(c => c.ContractId); modelBuilder.Entity<Media>() .HasMany(c => c.ContractMedias) .WithRequired() .HasForeignKey(c => c.MediaId); }
你也可以参考这些链接:
在Fluent API中使用额外字段进行多对多映射
entity frameworkCodeFirst与附加信息有许多关系
首先创build代码,多到很多,并在关联表中添加额外的字段
添加到@Tomas的答案,而不必使用Fluent API。
public class Media // One entity table { public int Id { get; set; } public string Name { get; set; } public virtual ICollection<ContractMedia> ContractMedias { get; set; } } public class Contract // Second entity table { public int Id { get; set; } public string Code { get; set } public virtual ICollection<ContractMedia> ContractMedias { get; set; } } public class ContractMedia // Association table implemented as entity { [Key] [Column(Order = 0)] [ForeignKey("Media")] public int MediaId { get; set; } [Key] [Column(Order = 1)] [ForeignKey("Contract")] public int ContractId { get; set; } public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } public double Price { get; set; } public virtual Media Media { get; set; } public virtual Contract Contract { get; set; } }