Plusieurs-à-plusieurs table de mappage
À partir d'exemples que j'ai vu en ligne et dans une Programmation Entity Framework CodeFirst livre, quand vous avez une collection sur les deux classes EF serait de créer une table de mappage comme MembersRecipes
et la clé primaire de chaque classe qui permettrait de relier cette table.
Cependant, quand je fais les ci-dessous, j'ai plutôt obtenir un nouveau champ dans la Recipes
table appelée Member_Id
et un Recipe_Id
dans le Members
table.
Qui crée seulement deux un-à-plusieurs liens, mais pas plusieurs-à-plusieurs pour que je puisse Membre 3 liée à des Recettes (4,5,6) et de la Recette 4 lié aux Membres (1,2,3), etc.
Est-il un moyen de créer cette table de correspondance? et si oui, comment avez-vous nom d'autre chose comme "livres de cuisine" ?
Grâce
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; }
}
Mise à JOUR:
Ci-dessous est une autre approche que j'ai essayé qui n'utilise pas l'API Fluent et remplace la AuthorId
& Author
sur Recipe
avec un propriétaire drapeau, j'ai aussi renommé l'exemple ci-dessous à partir de Cookbooks
à MembersRecipes
, cela résout aussi ma question similaire à la réponse, mais comme mentionné a d'autres conséquences.
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 Recipe
& Member
classes, j'ai changé les collections de
public virtual IList<MembersRecipes> MembersRecipes { get; set; }
- Concernant votre mise à jour, dans l'Entity Framework le langage que plusieurs-à-plusieurs approche est appelée plusieurs-à-plusieurs avec cartographie de la charge utile je ne sais pas pourquoi ils viennent avec un très chics terme(charge utile), ou c'est juste moi, ma langue maternelle n'est pas l'anglais 🙂 j'ai l'habitude d'associer le mot de charge utile avec un virus informatique. En EF, la charge utile n'est pas quelque chose de sinistre, vous pouvez l'avenir de votre conception en faisant votre table une charge utile-prêt entité(par exemple, Par l'ajout de l'ID comme clé primaire, par conséquent, vous avez besoin de convertir plusieurs-à-plusieurs composite pk unique des colonnes composites) à partir de l'obtenir-aller
- Dans votre cas, vous n'avez pas d'y ajouter une ID, vous avez maintenu la clé primaire composite. Le Propriétaire du pavillon, sur la table, la charge utile
- La charge utile se réfère à la table de correspondance (relation) où vous pouvez mettre des données supplémentaires (par exemple la date de création de la relation) dans . Si vous devez utiliser EF plusieurs-à-plusieurs avec une table masquée, vous ne pouvez pas ajouter une charge utile de la relation
- Pour moi, quand j'ai eu ce problème, c'est parce que l'un de mes propriétés de navigation a été un
List
et l'autre était uneIEnumerable
. J'ai changé pour les deux listes, puisAdd-Migration
a commencé à générer une XR table au lieu de simplement le FK propriétés.
Vous devez vous connecter pour publier un commentaire.
Le faire sur votre DbContext OnModelCreating:
Vous pouvez le faire dans l'autre sens aussi, c'est la même chose, juste de l'autre côté de la médaille:
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
Mise à JOUR
Pour éviter cyclique de référence sur votre propriété Auteur, de côté, de dessus, vous devez ajouter ceci:
Idée de source ici: EF Premier Code avec de nombreux de nombreux auto-référencement relation
Le noyau chose est, vous devez en informer EF que l'Auteur de propriété(qui est un Membre de l'instance) n'a pas de Recette collections(notée par
WithMany()
); de cette manière, cycliques de référence peut être arrêté à l'Auteur de la propriété.Ce sont les tables créées à partir du Premier Code mappages ci-dessus:
base.OnModelCreating(modelBuilder);
IdentityDbContext
comme la classe de base, mais je pense que c'est une bonne pratique de toute façon