2012-04-10 3 views
127

Irgendwelche Ideen, warum dies zu brechen sein könnte?Neue Transaktion ist nicht zulässig, da andere Threads in der Sitzung ausgeführt werden. LINQ To Entity

Ich habe gelesen, dass die Problemumgehung das Problem ist, die Ergebnisse in einem Rutsch vor der foreach-Schleife abrufen.

Aber habe ich das nicht getan? "pp" ist die Sammlung von Ergebnissen in meinem Fall

+10

Ist 'pp' das Ergebnis einer Linq-Abfrage? Wenn dies der Fall ist, müssen Sie möglicherweise eine 'ToList()' ausführen, um die Verbindung zur Datenbank zu trennen, bevor Sie die Schleife ausführen. – SouthShoreAK

+0

Ja ist es. Ok, ich werde das versuchen Danke –

+2

Anruf speichern Änderungen außerhalb Schleife – Mohsin

Antwort

321

Die pp Variable ist keine Sammlung von Objekten, es ist ein Enumerator, der Objekte zurückgeben kann. Während Sie den Enumerator verwenden, muss die Quelle geöffnet bleiben.

Verwenden Sie die ToList-Methode, um den Enumerator in eine Auflistung zu implementieren. Das liest alle Elemente aus dem Enumerator und schließt die Verbindung zur Quelle, sodass Sie die Verbindung für andere Dinge verwenden können.

foreach (var p in pp.ToList()) 
+14

Gott segne dich @Guffa !!! +1 –

+2

Großartig !! Es funktioniert auch mit pp.ToArray() –

+2

Ricardo, es funktioniert, solange es nicht IQueryable –

7

Was passiert, ist, dass Sie eine SQL-Verbindung mit einer Sammlung von db Einheiten iterieren, dann eine andere Verbindung mit Änderungen zu speichern. Dies geschieht, weil Ihre Klassen grundsätzlich mit einer Instanz Ihrer db-Verbindung "verheiratet" sind und nicht von einer anderen Instanz geändert werden können.

Um dies zu umgehen, rufen Sie .ToList() in Ihrer Sammlung auf, bevor Sie sie iterieren.

Und während Sie dabei sind, rufen Sie context.SaveChages() nur einmal nach der Schleife beendet, um den Code zu beschleunigen.

Verwandte Themen