一尘不染

如何在实体框架中创建多对多映射?

c#

在这种情况下,我有2个实体,例如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表(EF自动生成)中再添加3个字段。例如StartDate,EndDate和Price。无法将其添加到媒体实体中。

在这种情况下如何映射?


阅读 231

收藏
2020-05-19

共1个答案

一尘不染

如果要使用关联表中的其他数据创建多对多关系,则必须将关联表作为实体。纯多对多关系仅在具有实体ID的纯表中。

在您的情况下,它将是:

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; }
}

创建模型/实体后,需要在上下文中定义关系:

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 Framework Code中具有额外字段的多对多映射首先具有附加信息的多对多关系
首先在关联表中创建具有附加字段的多对多代码

2020-05-19