2011-01-14 11 views
0

Ich habe eine Webanwendung. Es liest eine Menge Daten auf kleinen Tabellen und ein paar schreibt. Ich möchte ganze Datenbanktabellen in den Cache ziehen und die zwischengespeicherten Daten abfragen. Ich überschreibe die Tabelle <T>() -Methode des Kontexts, sodass wir Cache anstelle von Live-Daten bereitstellen können. Funktioniert hervorragend für Einfügungen und unterstützt auch den Datenzugriff von Einheitentests. Genial.Caching Linq2Sql Daten

So begannen wir mit der Verwendung von Cache-Daten und stellten fest, dass Aktualisierungen und Löschungen nicht funktionieren.

Wir ziehen ein Objekt aus db, wirf es in eine Liste <T>, lege diese Liste in den httpCache und lege dann den Datenkontext ab.

Zwei Anfragen später, rufen wir die überschriebene Tabelle <T>, es ruft die Liste und zieht das Objekt aus. Wir ändern es und müssen dann das zwischengespeicherte, dann geänderte Objekt an den db-Kontext anhängen. So nennen wir myContext.Attach (myobject) und ..... BOOM

Ein Versuch unternommen wurde, befestigen oder ein Unternehmen hinzufügen, die nicht neu ist, vielleicht von einer anderen Datacontext geladen wurde. Dies wird nicht unterstützt.

Gibt es einen Weg um diese Einschränkung?

Antwort

1

Es klingt wie Ihre zwischengespeicherten Entitäten sind immer noch an den ursprünglichen DataContext angefügt, mit dem sie abgefragt wurden. Eine Möglichkeit (die Best Practice-Regel, den DataContext-Lebenszyklus kurz zu halten, zu umgehen) besteht darin, den DataContext zusammen mit Ihren Entitäten zwischenzuspeichern und diesen zwischengespeicherten Kontext zu verwenden, wenn Sie die zwischengespeicherten Entitäten löschen oder aktualisieren möchten.

Sie erwähnen, dass die zwischengespeicherten Entitäten "zwei Anforderungen später" verwendet werden. Wenn diese Anforderungen alle innerhalb eines kurzen Zeitraums auftreten, ist die Aufhebung der Kurzlebenszyklusregel möglicherweise kein Problem.

Eine weitere Möglichkeit besteht darin, Cache-Objekte, die sind basierend auf Einheiten, sondern die sind nicht Einheiten, und wenn es Zeit ist, Einheiten mit Werten in den zwischengespeicherten nicht Entitätsobjekten abfragen saubere Einheiten auf einen neuen Datacontext gespeichert zu aktualisieren , aktualisieren Sie diese Entitäten und speichern Sie dann den neu erstellten DataContext.

Es gibt noch andere Möglichkeiten, es zu tun - Ich habe das Buch LINQ in Action als sehr hilfreich im Umgang mit Fällen wie diesen gefunden.

+0

Ich markiere dies als die Antwort, weil "LinqToSql dies nicht unterstützt" * ist * die Antwort. –