Table de mappage plusieurs à plusieurs

D’après les exemples que j’ai vus en ligne et dans un livre Code Entity Framework de programmation, lorsque vous avez une collection sur les deux classes, EF crée une table de mappage telle que MembersRecipes et la clé primaire de chaque classe est liée à cette table.

Cependant, lorsque Member_Id la Recipe_Id ci-dessous, je reçois un nouveau champ dans la table Recipes , appelé Member_Id et un Recipe_Id dans la table Members .

Ce qui ne crée que deux relations un-à-plusieurs, mais pas plusieurs-à-plusieurs, donc je pourrais avoir le membre 3 lié aux recettes (4,5,6) et à la recette 4 liées aux membres (1,2,3) etc.

Est-il possible de créer cette table de mappage? Et si oui comment le nommez-vous autre chose comme “livres de cuisine”?

Merci

  public abstract class Entity { [Required] public int Id { get; set; } } public class Member : Entity { [Required] public ssortingng Name { get; set; } public virtual IList Recipes { get; set; } } public class Recipe : Entity { [Required] public ssortingng Name { get; set; } [ForeignKey("Author")] public int AuthorId { get; set; } public virtual Member Author { get; set; } .... public virtual IList Members { get; set; } } 

UPDATE: Voici une autre approche que j’ai essayée qui n’utilise pas l’API Fluent et remplace AuthorId & Author on Recipe par un indicateur de propriétaire, j’ai également renommé l’exemple ci-dessous de Cookbooks en MembersRecipes , cela corrige également mon problème réponse mais comme mentionné a d’autres implications.

 public class MembersRecipes { [Key, Column(Order = 0)] [ForeignKey("Recipe")] public int RecipeId { get; set; } public virtual Recipe Recipe { get; set; } [Key, Column(Order = 1)] [ForeignKey("Member")] public int MemberId { get; set; } public virtual Member Member { get; set; } public bool Owner { get; set; } } 

et dans Member classes Recipe & Member j’ai changé les collections en

 public virtual IList MembersRecipes { get; set; } 

Faites ceci sur votre DbContext OnModelCreating:

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasMany(x => x.Members) .WithMany(x => x.Recipes) .Map(x => { x.ToTable("Cookbooks"); // third table is named Cookbooks x.MapLeftKey("RecipeId"); x.MapRightKey("MemberId"); }); } 

Vous pouvez le faire dans l’autre sens, c’est pareil, juste un autre côté de la même pièce:

 modelBuilder.Entity() .HasMany(x => x.Recipes) .WithMany(x => x.Members) .Map(x => { x.ToTable("Cookbooks"); // third table is named Cookbooks x.MapLeftKey("MemberId"); x.MapRightKey("RecipeId"); }); 

Autres exemples:

http://www.ienablemuch.com/2011/07/using-checkbox-list-on-aspnet-mvc-with_16.html

http://www.ienablemuch.com/2011/07/nhibernate-equivalent-of-entity.html


METTRE À JOUR

Pour éviter une référence cyclique sur votre propriété Author, outre ce qui précède, vous devez append ceci:

 modelBuilder.Entity() .HasRequired(x => x.Author) .WithMany() .WillCascadeOnDelete(false); 

Idée obtenue ici: Code EF Premier avec plusieurs à plusieurs relations d’auto-référence

L’essentiel est que vous ayez besoin d’informer EF que la propriété Author (qui est une instance Member) n’a pas de collections Recipe (désignée par WithMany() ); De cette façon, la référence cyclique pourrait être arrêtée sur la propriété Author.

Voici les tables créées à partir des correspondances Code First ci-dessus:

 CREATE TABLE Members( Id int IDENTITY(1,1) NOT NULL primary key, Name nvarchar(128) NOT NULL ); CREATE TABLE Recipes( Id int IDENTITY(1,1) NOT NULL primary key, Name nvarchar(128) NOT NULL, AuthorId int NOT NULL references Members(Id) ); CREATE TABLE Cookbooks( RecipeId int NOT NULL, MemberId int NOT NULL, constraint pk_Cookbooks primary key(RecipeId,MemberId) );