En termes d'entités (ou d'objets), vous avez un Class
objet qui a une collection de Students
et un Student
objet qui a une collection de Classes
. Étant donné que votre StudentClass
table ne contient que les Id et aucune information supplémentaire, EF ne génère pas d'entité pour la table de jointure. C'est le comportement correct et c'est ce à quoi vous vous attendez.
Maintenant, lorsque vous faites des insertions ou des mises à jour, essayez de penser en termes d'objets. Par exemple, si vous souhaitez insérer une classe avec deux étudiants, créer l' Class
objet, les Student
objets, ajouter les étudiants à la Students
collection de la classe , ajouter l' Class
objet au contexte et appeler SaveChanges
:
using (var context = new YourContext())
{
var mathClass = new Class { Name = "Math" };
mathClass.Students.Add(new Student { Name = "Alice" });
mathClass.Students.Add(new Student { Name = "Bob" });
context.AddToClasses(mathClass);
context.SaveChanges();
}
Cela créera une entrée dans le Class
tableau, deux entrées dans le Student
tableau et deux entrées dans le StudentClass
tableau les reliant.
Vous faites essentiellement la même chose pour les mises à jour. Récupérez simplement les données, modifiez le graphique en ajoutant et supprimant des objets des collections, appelez SaveChanges
. Consultez cette question similaire pour plus de détails.
Modifier :
Selon votre commentaire, vous devez en insérer un nouveau Class
et y ajouter deux existants Students
:
using (var context = new YourContext())
{
var mathClass= new Class { Name = "Math" };
Student student1 = context.Students.FirstOrDefault(s => s.Name == "Alice");
Student student2 = context.Students.FirstOrDefault(s => s.Name == "Bob");
mathClass.Students.Add(student1);
mathClass.Students.Add(student2);
context.AddToClasses(mathClass);
context.SaveChanges();
}
Comme les deux étudiants sont déjà dans la base de données, ils ne seront pas insérés, mais comme ils sont maintenant dans la Students
collection de Class
, deux entrées seront insérées dans la StudentClass
table.
Essayez celui-ci pour la mise à jour:
la source
Je voulais ajouter mon expérience à ce sujet. En effet EF, lorsque vous ajoutez un objet au contexte, il change l'état de tous les enfants et entités associées en Added. Bien qu'il y ait une petite exception dans la règle ici: si les enfants / entités associées sont suivis par le même contexte, EF comprend que ces entités existent et ne les ajoute pas. Le problème se produit lorsque, par exemple, vous chargez les enfants / entités associées à partir d'un autre contexte ou d'une interface utilisateur Web, etc., puis oui, EF ne sait rien de ces entités et les ajoute toutes. Pour éviter cela, il suffit de récupérer les clés des entités et de les trouver (par exemple
context.Students.FirstOrDefault(s => s.Name == "Alice"))
dans le même contexte dans lequel vous voulez faire l'addition.la source
J'utilise la méthode suivante pour gérer la relation plusieurs-à-plusieurs où seules les clés étrangères sont impliquées.
Donc pour l' insertion :
Pour supprimer ,
la source
Dans le cadre d'entité, lorsqu'un objet est ajouté au contexte, son état passe à Ajouté. EF modifie également l'état de chaque objet pour être ajouté dans l'arborescence d'objets et, par conséquent, vous obtenez une erreur de violation de clé primaire ou des enregistrements en double sont ajoutés dans la table.
la source