¿Cómo crear una asignación de muchos a muchos en Entity Framework?

Aquí está el caso, tengo 2 entidades, como 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..* } 

El contrato tiene muchos Medias, parece que son muchos para muchos.

¡¡Pero!! en el código de ef primero, necesito 3 campos más en la tabla ContractMedia (ef auto generado). como StartDate, EndDate y Price. estos no se pudieron agregar en la entidad de Medios.

¿Cómo mapear en este caso?

Si desea crear una relación de muchos a muchos con datos adicionales en la tabla de asociación, debe crear la tabla de asociación como entidad. La relación pura de muchos a muchos solo está en la tabla pura con id de entidad.

En tu caso será:

 public class Media // One entity table { public int Id { get; set; } public string Name { get; set; } public bool Enabled { get; set; } public virtual ICollection ContractMedias { get; set; } } public class Contract // Second entity table { public int Id { get; set; } public string Code { get; set } public virtual ICollection 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; } } 

Y después de crear modelos / entidades, necesita definir relaciones en contexto:

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasKey(c => new { c.MediaId, c.ContractId }); modelBuilder.Entity() .HasMany(c => c.ContractMedias) .WithRequired() .HasForeignKey(c => c.ContractId); modelBuilder.Entity() .HasMany(c => c.ContractMedias) .WithRequired() .HasForeignKey(c => c.MediaId); } 

También puede consultar estos enlaces:
Asignación de muchos a muchos con campos adicionales en la API Fluent
Código del marco de la entidad: primera relación de muchos a muchos con información adicional
Crear código primero, muchos a muchos, con campos adicionales en la tabla de asociación

Agregando a @Tomas respuesta sin tener que usar Fluent API.

 public class Media // One entity table { public int Id { get; set; } public string Name { get; set; } public virtual ICollection ContractMedias { get; set; } } public class Contract // Second entity table { public int Id { get; set; } public string Code { get; set } public virtual ICollection 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; } }