Wie kann die .SaveChanges () -Methode in ADO.Net Data Services am besten verwendet werden?

8

Hat jemand gute Informationen über die Verwendung der .SaveChanges () -Methode?

Beim Versuch, die Methode .SaveChanges () für mein Datenkontextobjekt zu verwenden, treten verschiedene Probleme auf. Ich nehme Daten aus einer vorhandenen Datenquelle, erstelle die entsprechenden EntityFramework / DataService-Objekte, befülle diese erstellten Objekte mit Daten, füge diese Objekte dem Kontext hinzu und speichere diese Daten durch Aufruf von .SaveChanges.

Die Szenarien, die ich entwickelt habe (und die damit verbundenen Probleme) sind so ... In jedem Szenario habe ich eine foreach-Schleife, die Daten aus Zeilen in einer DataTable aufnimmt und die Objekte erzeugt, an die sie angehängt werden der Kontext wie sie gehen. (Hinweis: drei Objekte ein "Mitglied" und zwei "Adressen", die über einen SetLink-Aufruf angehängt werden) - im Grunde ist dies ein Konvertierungstool, um Daten aus einem Datenspeicher in einen von Data Services bereitgestellten Datenspeicher zu übertragen.

  • Rufen Sie .SaveChanges () ohne Parameter einmal am Ende der foreach-Schleife (d. h. außerhalb der Schleife) auf.
    • OutOfMemory-Fehler etwa 1/3 des Weges (30.000 von 90.000 Speichern) - nicht sicher, wie das geschieht, da jedes Speicherelement ein separater SQL-Aufruf an die Datenbank ist, was ist dann nicht mehr genug Speicher?
  • Rufen Sie .SaveChanges () ohne Parameter einmal pro Schleife auf
    • Das funktioniert, aber dauert absolut (8 Stunden für 90.000 speichert)
  • Rufen Sie .SaveChanges (SaveChangesOption.Batch) einmal am Ende der foreach-Schleife auf
    • Gleicher OutOfMemory-Fehler, aber ohne Speichern in der Datenbank
  • Rufen Sie .SaveChanges (SaveChangesOption.Batch) einmal pro Schleife auf
    • 404 Fehler nicht gefunden
  • Rufen Sie .SaveChanges (SaveChangesOption.Batch) einmal pro 10 Schleifen auf
    • 400 Fehlerhafter Anforderungsfehler (gelegentlich)
    • OutOfMemory nach einer Reihe von Iterationen
  • Eine Anzahl von zufälligen Versuchen, den Kontext einmal pro Schleife zu erstellen, oder ihn als Variable am Anfang der Schleife oder als private private Variable zu haben, die verfügbar ist.
    • Unterschiedliche Ergebnisse, nicht quantifizierbar, keine wirklich so gut

Was ist die bevorzugte Methode zum Aufrufen von .SaveChanges () von einem Client-Objekt, wenn eine große Datenmenge wie diese geladen wird? Gibt es etwas, über das ich nicht weiß, wie .SaveChanges () funktioniert? Kann jemand mehr Details zur Verfügung stellen, wie diese Funktion einmal genutzt werden sollte und welche (wenn überhaupt) Einschränkungen beim Speichern von Daten über Data Services bestehen? Gibt es Best Practices für den Methodenaufruf .SaveChanges ()? Gibt es eine besonders gute Dokumentation zum Methodenaufruf .SaveChanges ()?

    
ChrisHDog 10.10.2008, 03:49
quelle

2 Antworten

3

Ich habe keine große Erfahrung in der Verwendung von EntityFramework (nur ein zufälliges Experiment), haben Sie versucht, .SaveChanges () alle n Iterationen aufzurufen?

Ich meine so etwas:

%Vor%

Ich weiß, es ist hässlich, aber es ist die erste mögliche Lösung, die ich mir ausgedacht habe.

    
Maghis 11.12.2008, 15:09
quelle
0

Ich verwende EntityFramework auch für ein kleines Projekt, daher bin ich auch sehr an der Frage interessiert. Zwei kurze Fragen:    Haben Sie versucht, das Caching der Datenobjekte im Datenkontext abzuwenden?    Haben Sie versucht, den Datenkontext zu schließen und während der Schleife einen neuen erstellt, um Speicher freizugeben?

Grüße

Kenneth

    
Kenneth 04.11.2008 14:10
quelle