web-dev-qa-db-fra.com

Comment créer un mappage plusieurs à plusieurs dans Entity Framework?

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 ??

46
Kratos

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

87
Tomas

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