update one many framework first c# entity-framework many-to-many

c# - first - one to many entity framework



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

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

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

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

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

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