Inserisci / Aggiorna molti a molti Entity Framework. Come lo faccio?

Sto usando EF4 e nuovo ad esso. Ne ho molti a molti nel mio progetto e non riesco a capire come inserire o aggiornare. Ho costruito un piccolo progetto solo per vedere come dovrebbe essere codificato.

Supponiamo che io abbia 3 tavoli

  1. Classe: ClassID-ClassName
  2. Studente: StudentID-FirstName-Cognome
  3. StudentClass: StudentID-ClassID

Dopo aver aggiunto tutte le relazioni e aggiornato il modello tramite il browser del modello, ho notato che StudentClass non appare, questo sembra essere un comportamento predefinito.

Ora ho bisogno di fare sia un inserimento che un aggiornamento. Come si fa? Qualsiasi esempio di codice o collegamento dove posso scaricare un esempio o puoi risparmiare 5 minuti?

Prova questo per l’aggiornamento:

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

Volevo aggiungere la mia esperienza al riguardo. In effetti EF, quando aggiungi un object al contesto, cambia lo stato di tutti i bambini e delle quadro correlate da aggiungere. Anche se qui c’è una piccola eccezione: se i bambini / entity framework correlate vengono monitorati dallo stesso contesto, EF capisce che queste entity framework esistono e non le aggiunge. Il problema si verifica quando, ad esempio, caricate i bambini / quadro correlate da un altro contesto o un web ui ecc. E poi sì, EF non sa nulla di queste quadro e va e le aggiunge tutte. Per evitare ciò, basta ottenere le chiavi delle quadro e trovarle (ad es. context.Students.FirstOrDefault(s => s.Name == "Alice")) nello stesso contesto in cui si desidera eseguire l’aggiunta.

Nel framework di quadro, quando l’object viene aggiunto al contesto, il suo stato cambia in Aggiunto. EF cambia anche lo stato di ciascun object da aggiungere nella struttura ad albero e quindi ottieni un errore di violazione della chiave primaria o vengono aggiunti record duplicati nella tabella.

Uso il seguente modo per gestire la relazione molti-a-molti in cui sono coinvolte solo le chiavi esterne.

Quindi per l’ inserimento :

 public void InsertStudentClass (long studentId, long classId) { using (var context = new DatabaseContext()) { Student student = new Student { StudentID = studentId }; context.Students.Add(student); context.Students.Attach(student); Class class = new Class { ClassID = classId }; context.Classes.Add(class); context.Classes.Attach(class); student.Classes = new List(); student.Classes.Add(class); context.SaveChanges(); } } 

Per cancellare ,

 public void DeleteStudentClass(long studentId, long classId) { Student student = context.Students.Include(x => x.Classes).Single(x => x.StudentID == studentId); using (var context = new DatabaseContext()) { context.Students.Attach(student); Class classToDelete = student.Classes.Find(x => x.ClassID == classId); if (classToDelete != null) { student.Classes.Remove(classToDelete); context.SaveChanges(); } } }