2010-02-25 8 views
14

Wir laden Daten von db:Wie wird der ObjectContext-Cache von db aktualisiert?

var somethings = Context.SomethingSet.ToList(); 

Dann jemand löscht oder fügt Zeilen außerhalb des Kontextes. Out-Kontext hat Caches weiterhin gelöscht, weil es nicht weiß, dass sie gelöscht wurden. Selbst wenn ich Context.SomethingSet.ToList() aufruft, enthält unser Kontext immer noch gelöschte Objekte und Navigationseigenschaften sind nicht korrekt.

Was ist die beste Methode, um den ganzen Satz aus der Datenbank zu aktualisieren?

Antwort

18

Die Refresh Methode ist das, was Sie suchen:

Context.Refresh(RefreshMode.StoreWins, somethings); 
+1

Ich habe die Frage etwas geändert. Ich muss 'Context.Refresh (RefreshMode.StoreWins, somethings)' 'zuerst und' var somethings = Context.SomethingSet.ToList() 'aufrufen, um Zeilen hinzuzufügen, weil die Aktualisierung sie nicht hinzufügt. Ich habe gerade in Profiler festgestellt, dass die Aktualisierung in einer Abfrage erfolgt, so dass die Leistung ziemlich gut ist. Vielen Dank. – LukLed

10

Der EF-Datenkontext ist eine Implementierung des Unit of Work-Musters. Als solches ist es NICHT dazu gedacht, außerhalb der Arbeitseinheit, die gerade ausgeführt wird, herumzuhalten. Sobald Ihre Arbeit abgeschlossen ist, wird erwartet, dass Ihr Datenkontext verworfen wird.

Dies ist eine grundlegende Designentscheidung für EF v1, EF v4 und LINQ to SQL. Wenn Sie nicht über sehr spezifische Datennutzungsmuster und umfangreiche Speichervolumina verfügen, sollten Sie vermeiden, dass Ihre Datenkontexte länger als unbedingt erforderlich für die Fertigstellung Ihrer Arbeitseinheit verwendet werden.

http://sdesmedt.wordpress.com/2009/02/18/unit-of-work-pattern/

http://takacsot.freeblog.hu/Files/martinfowler/unitOfWork.html

+1

Ich wusste, dass jemand diese Antwort geben wird :) Mach dir keine Sorgen. Ich benutze einen ObjectContext pro Anfrage, aber ich habe einen Kontext, der verwendet wird, um einige Daten zwischenzuspeichern. Es wird nur zum Lesen verwendet. Aber es ist gut, dass du es bemerkt hast. – LukLed

+0

Nun, froh, dass Sie Ihre Kontexte entsorgen. : D Ich kann nicht mehr zählen, wie oft ich Leute sehe, die versuchen, ihre Objektkontexte für immer zu behalten. Sie versuchen, ein wahrgenommenes Problem zu lösen (ein angenommener Leistungseinbruch), während sie gleichzeitig ein Dutzend schlimmerer Probleme verursachen, die auf lange Sicht die Leistung noch mehr beeinträchtigen. Ich versuche, dieses Verhalten zu unterdrücken, wenn ich darauf stoße. ; P – jrista

1

Für virtuelle Objekte Reload hilft nicht. Es muss sich trennen und wieder laden