Insérer / mettre à jour plusieurs en plusieurs Entity Framework. Comment fait-on ça?

c# entity-framework many-to-many

Question

J'utilise EF4 et c'est nouveau. J'ai plusieurs projets dans mon projet et n'arrive pas à comprendre 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. Etudiant: Etudiant ID-Prénom-Nom
  3. StudentClass: StudentID-ClassID

Après avoir ajouté toutes les relations et mis à jour le modèle via le navigateur de modèles, j'ai remarqué que StudentClass n'apparaissait pas, il semble s'agir d'un comportement par défaut.

Maintenant, je dois faire une insertion et une mise à jour. Comment faites-vous? Des exemples de code ou des liens sur lesquels je peux télécharger un exemple, ou pouvez-vous épargner 5 minutes?

Réponse acceptée

En termes d'entités (ou d'objets), vous avez un objet Class qui a une collection d' Students et un objet Student qui a une collection de Classes . Etant donné que votre table StudentClass contient uniquement 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 que vous attendez.

Maintenant, lorsque vous effectuez 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éez l'objet Class , les objets Student , ajoutez les étudiants à la collection de classes. La collection Students ajoute l'objet Class au contexte et appelez 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 la table Class , deux entrées dans la table Student et deux entrées dans la table StudentClass 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 en supprimant des objets de collections, appelez SaveChanges . Cochez cette question similaire pour plus de détails.

Modifier :

Selon votre commentaire, vous devez insérer une nouvelle Class et y ajouter deux Students existants:

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

Étant donné que 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 la Class , deux entrées seront insérées dans la StudentClass table.


Réponse populaire

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


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow