117 votes

Insertion/mise à jour Many to Many Entity Framework . Comment dois-je m'y prendre ?

J'utilise EF4 et je suis novice en la matière. J'ai un "many to many" dans mon projet et je n'arrive pas à trouver comment insérer ou mettre à jour. J'ai construit un petit projet juste pour voir comment il devrait être codé.

Supposons que j'ai 3 tables

  1. Classe : ClassID-ClassName
  2. Étudiant : StudentID-Prénom-Surnom
  3. StudentClass : StudentID-ClassID

Après avoir ajouté toutes les relations et mis à jour le modèle via le navigateur de modèle, j'ai remarqué que StudentClass n'apparaît pas, cela semble être le comportement par défaut.

Maintenant, je dois faire à la fois une insertion et une mise à jour. Comment procédez-vous ? Avez-vous des exemples de code ou un lien où je peux télécharger un exemple, ou pouvez-vous me consacrer 5 minutes ?

149voto

Yakimych Points 9312

En termes d'entités (ou d'objets), vous avez une Class qui possède une collection de Students y un Student qui possède une collection de Classes . Puisque votre StudentClass ne contient que les Ids et aucune information supplémentaire, EF ne génère pas d'entité pour la table de jonction. C'est le comportement correct et c'est ce que vous attendez.

Maintenant, lorsque vous effectuez des insertions ou des mises à jour, essayez de penser en termes d'objets. Par exemple, si vous voulez insérer une classe avec deux étudiants, créez l'objet Class l'objet Student ajoutez les élèves à la classe Students ajoute la collection Class 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 deux entrées dans la table Student et deux entrées dans la table StudentClass table les reliant entre eux.

Vous faites essentiellement la même chose pour les mises à jour. Il suffit d'aller chercher les données, de modifier le graphe en ajoutant et en retirant des objets des collections, d'appeler SaveChanges . Vérifier cette question similaire pour les détails.

Editar :

D'après votre commentaire, vous devez insérer une nouvelle Class et ajouter deux Students à ce sujet :

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();
}

Puisque les deux élèves sont déjà dans la base de données, ils ne seront pas insérés, mais puisqu'ils sont maintenant dans le fichier Students collection de la Class deux entrées seront insérées dans le StudentClass table.

51voto

Stritof Points 81

Essayez celui-ci pour la mise à jour :

[HttpPost]
public ActionResult Edit(Models.MathClass mathClassModel)
{
    //get current entry from db (db is context)
    var item = db.Entry<Models.MathClass>(mathClassModel);

    //change item state to modified
    item.State = System.Data.Entity.EntityState.Modified;

    //load existing items for ManyToMany collection
    item.Collection(i => i.Students).Load();

    //clear Student items          
    mathClassModel.Students.Clear();

    //add Toner items
    foreach (var studentId in mathClassModel.SelectedStudents)
    {
        var student = db.Student.Find(int.Parse(studentId));
        mathClassModel.Students.Add(student);
    }                

    if (ModelState.IsValid)
    {
       db.SaveChanges();
       return RedirectToAction("Index");
    }

    return View(mathClassModel);
}

4voto

Nilesh Hirapra Points 21

Dans le cadre de l'entité, lorsqu'un objet est ajouté au contexte, son état devient Added. EF change également l'état de chaque objet en ajoutant dans l'arbre d'objet et donc vous obtenez soit une erreur de violation de clé primaire ou des enregistrements en double sont ajoutés dans la table.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X