2016-08-04 22 views
0

Ich poste Modellobjekt aus Sicht, in der Eltern und Kind-Liste existieren und auch ich nehme ein anderes Objekt, das ich aus der Datenbank bin. So vergleiche ich Objekte wieAktualisieren und Löschen von Datensatz durch Modellbindung in asp.net mvc

public bool ChildRecords(CheckListTemplate questList) 
     { 
      int templateId = questList.Id; 
      if (templateId > 0 && questList.Questions.Count() > 0) 
      { 
       var template =DBContext.CheckListTemplates.Include(p => p.Questions).SingleOrDefault(p => p.Id == templateId); 
       template.Name = questList.Name; 
       List<CheckListQuestion> delQuestions = new List<CheckListQuestion>(); 
       foreach(CheckListQuestion q in template.Questions) 
       { 
        var question = questList.Questions.Where(x => x.Id == q.Id).FirstOrDefault(); 
        if (question == null) 
        { 
               delQuestions.Add(q); 
        } 
        else 
        { 
         q.Question = question.Question; 
         q.Clause = question.Clause; 
        } 
       } 
       if(delQuestions.Count()>0) 
       { 
        foreach(CheckListQuestion qst in delQuestions) 
        { 
         var itemToRemove = template.Questions.Single(r => r.Id == qst.Id); 
         template.Questions.Remove(qst); 
        } 
       }     
DBContext.Entry(template).State = EntityState.Modified; 
       DBContext.SaveChanges(); 
} 

ich bin Aktualisierung und records.If löschen i die Aufnahmefunktion funktionieren aktualisieren, aber wenn ich den Datensatz löschen und veröffentlichen die Ansicht dann DBContext.Entry (Template) .State = EntityState.Modified; gibt Fehler.Wie kann ich Datensatz löschen.Was fehlt mir in den Code.

Antwort

0

Es wäre gut, wenn Sie den Fehler mit uns teilen könnten. Aber wenn Sie Ihren Code betrachten, liegt der Fehler wahrscheinlich darin, dass Sie versuchen, einen Datensatz innerhalb einer Schleife zu löschen, und das funktioniert nicht.

Sie können Ihren Code vereinfachen, indem Sie nur die IDs der Datensätze speichern, die Sie löschen möchten. Beispiel:

public bool ChildRecords(CheckListTemplate questList) 
    { 
     int templateId = questList.Id; 
     if (templateId > 0 && questList.Questions.Count() > 0) 
     { 
      var template = DBContext.CheckListTemplates.Include(p => p.Questions).SingleOrDefault(p => p.Id == templateId); 
      template.Name = questList.Name; 
      List<int> delQuestions = new List<int>(); 
      foreach(CheckListQuestion q in template.Questions) 
      { 
       var question = questList.Questions.Where(x => x.Id == q.Id).FirstOrDefault(); 
       if (question == null) 
        delQuestions.Add(q.Id); 
       else 
       { 
        q.Question = question.Question; 
        q.Clause = question.Clause; 
       } 
      } 

      if(delQuestions.Count()>0) 
       DBContext.CheckListTemplates.RemoveRange(DBContext.CheckListTemplates.Where(x => ids.Contains(x.Id))); 

      DBContext.Entry(template).State = EntityState.Modified; 
      DBContext.SaveChanges(); 
     } 
    } 
+0

ich nicht der Rekord in loop.I am Löschen nur in Objektliste ist hinzufügen und später löschen, wenn Schleife finished.I Betrieb soll durch eine Objektliste durch modifizierte Entitätsstatus. –

+0

Dies können Sie nicht tun. Das ist, was ich rede .... foreach (CheckListQuestion qst in delQuestions) { var itemToRemove = template.Questions.Single (r => r.Id == qst.Id); template.Questions.Remove (qst); } Wenn Sie dies wirklich aus irgendeinem Grund verwenden müssen anstelle von foreach. –