Как создать сопоставление "многие ко многим" в 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; }
}