.NET EntityFramework: "Beim Starten einer Transaktion auf der Provider-Verbindung ist ein Fehler aufgetreten. Siehe die innere Ausnahme für Details "

8

Verwenden von Entity Framework in .NET Ich möchte eine Liste von Elementen durchlaufen, die von der Datenbank zurückgegeben werden, und Aktualisierungen vornehmen.

%Vor%

Nach: Ссылка S Hargroves schlägt vor, in eine IList zu konvertieren, und das ist die Lösung.

Habe das nicht versucht, ich bin mir sicher, dass es funktioniert, aber selbst wenn es funktioniert, möchte ich wissen, warum ich das Element während der Schleife nicht aktualisieren kann? Dies geschieht in meiner lokalen Entwicklungsumgebung, ohne dass andere Benutzer auf die Datenbank treffen.

Danke ...

    
CWinKY 18.02.2010, 00:12
quelle

4 Antworten

11

Wenn Sie die Datenbank mit SaveChanges für eine Abfrage aktualisieren, wird die Abfrage ungültig gemacht. Die Ergebnismenge wurde möglicherweise durch das von Ihnen durchgeführte Update geändert.

Mit ToList lösen Sie die Ausführung der Abfrage aus und bringen alle Ergebnisse aus der Datenbank in den Speicher. Ihre In-Memory-Liste ist jetzt konkreter und nicht mehr daran interessiert, eine Abfrage zu sein.

Weil Objektabfragen IEnumerable verwenden, ist es nicht ok, etwas zu tun, das die Liste in einer foreach ändert.

Ich glaube auch, dass dieser Code aus den gleichen grundlegenden Gründen scheitern würde:

%Vor%     
Tilendor 17.02.2011 20:30
quelle
3

Ich würde dem Var eine Liste geben. Verwenden Sie dann in Ihrer foreach, anstatt Objekt Objekt in Qry zu verwenden, Kundenkunde in Qry. In diesem Szenario arbeiten Sie wirklich mit Kundenobjekten, nicht nur mit Objekten. In den meisten Fällen möchten Sie SaveChanges () nicht in einem Foreach aufrufen, da bei jeder Ausführung ein Update-Befehl auf dem Server ausgeführt wird. Wenn du es nach der foreach machst, wird es einen Batch von Aufrufen an die Datenbank machen und viel schöner durchführen.

Mein vorgeschlagener Pseudocode sieht ungefähr wie

aus %Vor%     
awright18 18.02.2010 00:46
quelle
3

Ok, ich bin auf dasselbe Problem gestoßen. Momentan habe ich keine Million Datensätze, sondern nur etwa 20K, aber die Tabelle, die ich verarbeiten möchte, speichert Bilder, so dass die Verarbeitung der Tabelle zu einer Liste viel zu lange dauert, sogar auf einer Desktop-App.

Ich benutze LinqToSql, seit es herausgekommen ist, und es funktioniert gut in LinqToSql, also war ich ein bisschen sauer, als ich gesehen habe, dass es in Entity nicht funktioniert. Und es ist dumm, dass Microsoft es in Entity nicht geschafft hat, aber hier ist die Arbeit herum. Stellen Sie 2 Context-Objekte her. Eine für die Liste und eine für die Updates wie folgt.

%Vor%

Sie können mehr in meinem Blogbeitrag () sehen ASP.Net Hilfe Blog )

    
Ron 19.06.2011 17:51
quelle
0

Danke für die Empfehlung zu SavingChanges after loop, daran hatte ich nicht gedacht. Allerdings muss ich mehr als 1 Million Datensätze verarbeiten, das ist nicht so viel, aber es gibt etwas Verarbeitung, die während jeder Schleife durchgeführt wird. Ich bin ein wenig besorgt, dass es sehr viel Zeit kosten wird, die 1 Million Datensätze, die die Informationen aktualisieren, zu durchlaufen und dann eine Weile zu brauchen, um die Änderungen zu veröffentlichen.

Ich weiß auch, dass das EntityFramework wahrscheinlich nicht der beste Ansatz ist, aber ich bin daran interessiert, Features und Einschränkungen von Entity Framework zu lernen.

Auch nur, um zu bemerken, dass die var-Liste tatsächlich eine ObjectQuery vom Kundentyp zurückgibt. Daher kann die foreach-Schleife tatsächlich wie oben beschrieben geschrieben werden, indem der Datentyp "Kunde" verwendet wird, ohne dass eine Konvertierung in eine Liste erfolgt.

Noch einmal meine Frage, die ich gerne wissen würde, warum kann ich während der Schleife keine Änderung in demselben Kontextobjekt (DBEntities) veröffentlichen?

    
CWinKY 18.02.2010 04:25
quelle

Tags und Links