Как создать сопоставление "многие ко многим" в Entity Framework?

вот случай, у меня есть 2 сущности, такие как контракт、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 мне нужно еще 3 поля в таблице ContractMedia (автоматически генерируется EF). такие как StartDate,EndDate и цена. их не удалось добавить в Media entity.

Как отобразить в этом случае??

2 ответов


Если вы хотите создать отношение "многие ко многим" с дополнительными данными в таблице ассоциации, вы должны сделать таблицу ассоциации сущностью. Чистые отношения "многие ко многим" находятся только в чистой таблице с идентификаторами сущности.

в вашем случае это будет:

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 CodeFirst многие ко многим отношения с дополнительной информацией
создать код, во-первых, многие-ко-многим с дополнительными полями в таблице ассоциации


добавление в ответ @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; }
}