Frage

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

() -Methode auf meinem Daten Kontextobjekt

ich eine Vielzahl von Themen erlebe, wenn den .SaveChanges zu nutzen versuchen. Ich nehme Daten aus einer vorhandenen Datenquelle, die entsprechenden EntityFramework / Data Erstellen von Objekten, diese erzeugten Objekte mit Daten bevölkern, die Objekte auf den Kontext Hinzufügen und dann Speichern, dass die Daten durch .SaveChanges aufrufen.

Die Szenarien ich gekommen bin oben mit (und die mit ihnen verbundenen Probleme) sind als solche ... In jedem Szenario habe ich eine foreach-Schleife, die Daten von Zeilen in einer Datatable nimmt und die Objekte zu erzeugen, die Befestigung an der Kontext, wie sie gehen. (Anmerkung: drei Objekte ein „Mitglied“ und zwei „Adressen“, die über einen SetLink Aufruf angeschlossen sind) - im Grunde ist dies ein Werkzeug zur Umwandlung von Daten von einem Datenspeicher zu nehmen und es in ein Datenspeicher-Massage, die von Data Services ausgesetzt ist.

  • Anruf .SaveChanges () ohne Parameter einmal am Ende der foreach Schleife (d.h. außerhalb der Schleife)
    • OutOfMemory Fehler etwa 1/3 der Art und Weise (30.000 von 90.000 sparen) - nicht sicher, wie dass, obwohl geschieht, da jedes Element speichern ein separater SQL-Aufruf an die Datenbank ist, was ist da an Speicher zu laufen?
  • Anruf .SaveChanges () ohne Parameter einmal pro Schleife
    • Dies funktioniert, aber nimmt absolutly für immer (8 Stunden für 90.000 spart)
  • Anruf .SaveChanges (SaveChangesOption.Batch) einmal am Ende der foreach-Schleife
    • Same OutOfMemory Fehler, aber ohne speichert sie in der Datenbank
  • Anruf .SaveChanges (SaveChangesOption.Batch) einmal pro Schleife
    • 404 Fehler nicht gefunden
  • Anruf .SaveChanges (SaveChangesOption.Batch) einmal pro 10 Schlaufen
    • 400 Bad Request Fehler (occassionally)
    • OutOfMemory nach einer Reihe von itterations
  • Eine Reihe von zufälligen Versuchen, den Zusammenhang einmal pro Schleife zu erzeugen, oder es als eine Variable zu Beginn der Schleife haben oder hat es als eine private Variable, die verfügbar ist.
    • Unterschiedliche Ergebnisse, nicht in der Lage zu quantifizieren, kein wirklich so gut

Was ist die bevorzugte Methode .SaveChanges des Aufrufs () von einem Client-Objekt, wenn eine große Datenlast wie dies zu tun? Gibt es etwas, ich bin nicht immer darüber, wie .SaveChanges () funktioniert? Kann jemand mehr Details darüber, wie einmal diese Funktion wurde unter Verwendung sollte und was (falls vorhanden) sind die Beschränkungen in Bezug auf Daten über Data Services zu speichern? Gibt es Best Practices rund um die .SaveChanges () -Methode? Gibt es eine besonders gute Dokumentation über die .SaveChanges () -Methode?

War es hilfreich?

Lösung

Ich habe keine große Erfahrung im Umgang mit EntityFramework (nur einige Zufallsexperiment), haben Sie .SaveChanges () alle n Iterationen versucht, ruft an?

Ich meine etwas wie folgt aus:

int i = 0;
foreach (var item in collection)
{
    // do something with your data
    if ((i++ % 10) == 0)
        context.SaveChanges();
}
context.SaveChanges();

Ich weiß, es ist hässlich, aber es ist die erste mögliche Lösung kam ich mit.

Andere Tipps

Ich bin mit EntityFramework an einem kleinen Projekt auch so bin ich auch in der Frage sehr interessiert. Zwei kurze Fragen:    Haben Sie versucht, die Caching og die Datenobjekte in der Datacontext zu verwandeln?    Haben Sie versucht, die Datacontext und erstellt ein neues während der Schleife zu schließen Speicher freizugeben?

Viele Grüße

Kenneth

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top