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