Voici le cas, j'ai 2 entités, telles que Contrat 、 Média
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..*
}
Le contrat a de nombreux médias, il semble qu’ils soient nombreux à beaucoup.
Mais, au début du code ef, j'ai besoin de 3 champs supplémentaires dans la table ContractMedia (générés automatiquement). Tels que StartDate, EndDate et Price. Ils ne peuvent pas être ajoutés dans l'entité Media.
Comment mapper à ce cas ??
Si vous souhaitez créer plusieurs relations avec des données supplémentaires dans la table d'association, vous devez créer la table d'association en tant qu'entité. La relation pure plusieurs à plusieurs se trouve uniquement dans une table pure avec des identifiants d'entité.
Dans votre cas ce sera:
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; }
}
Et après avoir créé des modèles/entités, vous devez définir les relations en contexte:
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);
}
Aussi, vous pouvez vous référer à ces liens:
Mappage plusieurs à plusieurs avec des champs supplémentaires dans l'API Fluent
relation nombre à plusieurs entre Entity Framework Code et informations supplémentaires
Créez d'abord le code, plusieurs à plusieurs, avec des champs supplémentaires dans la table d'association
L'ajout à @Tomas répond sans avoir à utiliser l'API Fluent.
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; }
}