Verhindern Sie mit Entity Framework, dass zwischengespeicherte Objekte in der Datenbank landenC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Verhindern Sie mit Entity Framework, dass zwischengespeicherte Objekte in der Datenbank landen

Post by Anonymous »

Wir haben ein ASP.NET-Projekt mit Entity Framework und SQL Azure.

Ein großer Teil unserer Daten muss nur ein paar Mal am Tag aktualisiert werden, andere Daten sind sehr volatil.
  • Die Daten, die sich kaum ändern, werden beim Start im Speicher zwischengespeichert, vom Kontext getrennt und dann hauptsächlich zum Lesen verwendet, was die Anzahl der Datenbankanfragen, die wir ausführen müssen, drastisch reduziert.
  • Die flüchtigen Daten werden jedes Mal von einem DbContext per HTTP-Anfrage angefordert.
  • Wenn wir eine Aktualisierung der zwischengespeicherten Daten durchführen, senden wir eine Nachricht an alle Instanzen, um eine neue Version abzurufen aller Daten vom SQL-Server.
So weit, so gut.

Bis wir einen Fehler einführten, der eines dieser „zwischengespeicherten“ Objekte mit den „flüchtigen“ Daten verknüpfte und SaveChanges durchführte.

Nun, das war ein ziemliches Durcheinander.

Der gesamte Datenbaum wurde bei jedem Update wieder hinzugefügt, wodurch die gesamte Datenbank durch eine Menge Duplikate beschädigt wurde Daten.

Als kompletter Hack habe ich eine völlig beliebige Spalte mit einer UniqueConstraint und einigen Kauderwelschdaten in einer der Stammtabellen hinzugefügt; Hoffentlich schlägt SaveChanges() fehl, wenn wir das nächste Mal einen solchen Fehler einführen, weil er gegen die Unique Constraint verstößt.

Aber es ist natürlich hackig und ich habe immer noch ziemliche Angst ;P
Gibt es bessere Möglichkeiten, um zu verhindern, dass ganze Bäume zwischengespeicherter Objekte in der Datenbank landen?

Weitere Informationen
  • Projekt ist ASP.NET MVC
  • Ich speichere diese Daten, da sie hauptsächlich schreibgeschützt sind, und das erspart eine Menge zusätzlicher Datenbankaufrufe pro http-Anfrage
  • Dies ist eine stark frequentierte Website mit vielen persönlichen benutzerdefinierten Ansichten. Die POCO-Daten im Speicher zu haben, funktioniert wirklich gut für das, was ich will. Außer dem Problem, das ich erwähnt habe.
  • Es ist etwas komplizierter, aber eine vereinfachte Version besteht darin, dass ich die Objekte durch einen Singleton zwischenspeichere: also d. h.:

Code: Select all

EntityCache.Instance.LolCats = new DbContext().LolCats.AsNoTracking().ToList();
Diesen Cache füge ich durch Abhängigkeit in meine Controller ein.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post