0

Ich habe eine Tabelle in der Datenbank namens Course_Predecessor und ich versuche, alle Elemente aus dieser Tabelle mit EF löschen und dann neue Daten in die Tabelle hinzufügen. Ich kann die Daten nicht löschen, weil ich den folgenden Fehler erhalte: "Sammlung wurde geändert Enumerationsoperation kann nicht ausgeführt werden"Löschen von Elementen in db mit Entity Framework fehlgeschlagen

Dies ist der Code, den ich verwende (innerhalb einer Funktion, die den Kontext der DB als erhält ctx)

List<Course_Predecessor> lst = new List<Course_Predecessor>(); 
fillTheList(ref lst , someData); 

ctx.Course_Predecessor.RemoveRange(ctx.Course_Predecessor.ToList()); 
ctx.Course_Predecessor.AddRange(predecessors); 

Ich bekomme den Fehler bei der RemoveRange-Funktion.

würde mich über jede Hilfe freuen.

+0

Was passiert, wenn Sie 'ctx.Course_Predescessor.RemoveRange (ctx.Course_Predesector.ToList());' ohne umgebenden Code ausführen? Dies sollte gut funktionieren. –

Antwort

0

die Sie interessieren,

ctx.Course_Predecessor.ToList().ForEach(r => ctx.Course_Predecessor.DeleteObject(r)); 
ctx.SaveChanges(); 
+0

Ich modifiziere die Elemente nicht. lst ist eine Liste der neuen Elemente, die ich in die Tabelle einfügen möchte (die Funktion fügt nur die Werte in die Liste), dann möchte ich alle Tabelle entfernen und neue Werte einfügen – Adam

+0

@Adam haben Sie versucht, wie vorgeschlagen – Sajeetharan

+0

kann ich ' t versuchen dies, weil es nicht meine Situation passt mein Freund Ich brauche diese Zeilen, um die neuen Werte einfügen – Adam

1

können Sie versuchen, wie folgend:

ctx.Course_Predecessor.ToList().ForEach(c => ctx.Course_Predecessor.Remove(c)); 
+0

es sagt das ForEach ist nicht definiert – Adam

+0

Sorry, ich habe zu verpassen .ToList(). Siehe meine aktualisierte Antwort. Dies sollte für Sie arbeiten. – user1990

1

Wenn Sie EF6 verwenden (die wie Sie aussieht, ist), dann sollten Sie in der Lage sein, alle Datensätze löschen in die Tabelle, indem Sie Folgendes tun. (Man beachte das Fehlen der .ToList() Methode im RemoveRange Aufruf)

ctx.Course_Predecessor.RemoveRange(ctx.Course_Predecessor); 
ctx.SaveChanges(); 

Alternativ könnten Sie tun:

foreach (var predecessor in ctx.Course_Predecessor) 
{ 
    ctx.Entry(predecessor).State = EntryState.Deleted; 
} 
ctx.SaveChanges(); 

Beiden Abschnitte des Codes zu tun, die genau die gleiche Sache.

+0

es sagt immer noch die Sammlung wurde geändert – Adam

+0

@Adam Ich glaube nicht, dass der 'RemoveRange' Aufruf die Sammlung modifizierte Ausnahme auslöst. Ich kann den genauen Code ohne Probleme ausführen. Es scheint, als ob Sie eine Auflistung ändern, während Sie sie in einem vorherigen Abschnitt des Codes aufzählen, in dem Sie denselben Datenkontext verwenden. Wäre es möglich, dass Sie Ihre Frage aktualisieren, um den Code für die "fillTheList" -Methode und jeden anderen Code, der ausgeführt wird, bevor Sie versuchen, alle Datensätze aus dieser Tabelle zu entfernen und anschließend 'SaveChanges' aufzurufen? – sam2929

Verwandte Themen