D'après les exemples que j'ai vus en ligne et dans le livre Programming Entity Framework CodeFirst, lorsque vous avez une collection sur les deux classes, EF créerait une table de correspondance telle que MembersRecipes
et la clé primaire de chaque classe serait liée à cette table.
Cependant, lorsque je fais ce qui suit, j'obtiens à la place un nouveau champ dans le champ Recipes
table appelée Member_Id
et un Recipe_Id
dans le Members
table.
Cela ne crée que deux relations de type "un vers plusieurs", mais pas de type "plusieurs vers plusieurs". Je pourrais donc avoir le membre 3 lié aux recettes (4, 5, 6) et la recette 4 liée aux membres (1, 2, 3), etc.
Existe-t-il un moyen de créer cette table de correspondance ? Et si oui, comment la nommer autrement, par exemple "livres de cuisine" ?
Merci
public abstract class Entity {
[Required]
public int Id { get; set; }
}
public class Member : Entity {
[Required]
public string Name { get; set; }
public virtual IList<Recipe> Recipes { get; set; }
}
public class Recipe : Entity {
[Required]
public string Name { get; set; }
[ForeignKey("Author")]
public int AuthorId { get; set; }
public virtual Member Author { get; set; }
....
public virtual IList<Member> Members { get; set; }
}
UPDATE : Vous trouverez ci-dessous une autre approche que j'ai essayée, qui n'utilise pas l'API Fluent et remplace la fonction AuthorId
& Author
en Recipe
avec un drapeau de propriétaire, j'ai également renommé l'exemple ci-dessous de Cookbooks
a MembersRecipes
Cela résout également mon problème de la même manière que la réponse, mais comme mentionné, cela 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 en Recipe
& Member
J'ai changé les collections en
public virtual IList<MembersRecipes> MembersRecipes { get; set; }