2016-04-07 18 views
0

Ich habe einen Übermittlungscontroller, der eine zu vielen Beziehungen zu wenigen anderen Tabellen hat. Unten ist mein Modell:Löschen von Datensatz mit untergeordneten Datensätzen

public partial class Submission 
{ 
    public Submission() 
    { 
     this.WorkorderLogs = new HashSet<WorkorderLog>(); 
    } 

    public int Id { get; set; } 
    public int WorkOrderId { get; set; } 
    public int PartStagingId { get; set; } 
    public System.DateTime SubmissionDate { get; set; } 

    public virtual PartStaging PartStaging { get; set; } 
    public virtual WorkOrder WorkOrder { get; set; } 
    public virtual ICollection<WorkorderLog> WorkorderLogs { get; set; } 
} 

Ich möchte, dass die Anwendung alle untergeordneten Datensätze löschen, wenn ich einen Übermittlungsdatensatz lösche. Unten ist meine Löschmethode:

[HttpPost, ActionName("Delete")] 
[ValidateAntiForgeryToken] 
public ActionResult DeleteConfirmed(int id) 
{ 
    Submission submission = db.Submissions.Find(id); 

    foreach (var w in submission.WorkorderLogs) 
    { 
     submission.WorkorderLogs.Remove(w); 
    } 

    db.Submissions.Remove(submission); 
    db.SaveChanges(); 

    return RedirectToAction("Index"); 
} 

Dies gibt mir einen Fehler nach der ersten Iteration der foreach-Schleife. Im Folgenden wird der Fehler erhalte ich:

Exception Details: System.InvalidOperationException: Collection was modified; enumeration operation may not execute. 

Wie kann ich die untergeordneten Datensätze in diesem Fall löschen?

+0

See [hier] (http://stackoverflow.com/questions/16654828/how-to-remove -ein-zu-viele-bezogene-Datensätze-in-ef-Code-erste-Datenbank). Sie können auch Kaskadenlöschungen konfigurieren, anstatt zuerst alle untergeordneten Elemente zu löschen. Siehe [hier] (http://stackoverflow.com/questions/5614485/deleting-multiple-records-for-a-related-table) und [hier] (http://stackoverflow.com/questions/5448702/cascading) -deletes-mit-entity-framework-related-entities-deleted-by-ef) und ... – Jasen

+0

Dies hat nichts mit kinderbezogenen Datensätzen zu tun. Sie werden das gleiche Problem bekommen, wenn Sie EF nicht benutzen. Sie ändern eine Sammlung, während Sie sie durchlaufen. das ist nicht erlaubt. Sie müssen eine for-Schleife verwenden und rückwärts gehen, um das Objekt aus der Sammlung zu entfernen, oder wenn möglich, entfernen Sie RemoveAll aus der Sammlung! –

Antwort

0

ich nicht aktivieren die On Cascade löschen, aber ich geändert, um die foreach-Schleife und es funktioniert

foreach (var w in db.WorkorderLogs.Where(x => x.SubmissionId == submission.Id)) 
{ 
    db.WorkorderLogs.Remove(w); 
} 
Verwandte Themen