Ich sehe, es gibt viele Fragen zum EF-Cache, aber ich habe noch keine Lösung für mein Problem gefunden.
Wie deaktiviere ich den Cache von Entity Framework 6 vollständig? Oder kann ich EF programmatisch mitteilen, den Cache zu vergessen, weil etwas mit Daten passiert ist?
Zuerst habe ich geerbt eine Anwendung, die aus einer seltsamen Mischung von EF (Modell - zuerst zum Definieren von Entitäten) und einfachem altem SQL (zum Manipulieren von Daten) gemacht wurde. Ich habe die Anwendung umgestaltet, um:
GetAll()
für eine Entität) verwenden EF6 LINQ DbContext.Database.Connection
bei Bedarf Spring.Web
support hinzu, um DI und Transaktionen (noch nicht) zu aktivieren An der aktuellen Stelle habe ich den Code so reorganisiert, dass die Hauptfunktion der Anwendung (komplexe SQL-Abfragen in riesigen Datenmengen) wie zuvor funktioniert, aber die Manipulation der Domänenmanipulation mit Hilfe von als smarter durchgeführt wird das meiste Entity Framework als möglich
Eine der Seiten, die ich geerbt habe, ist eine Multi-Checkbox-Seite, die ich Ihnen zum besseren Verständnis zeigen werde. Ich werde nicht auf die Wahl des vorherigen Implementers eingehen, da es billiger ist, mein aktuelles Problem zu beheben und den Code später zu refaktorisieren, als die Entwicklung für ein defektes Feature zu blockieren.
So sieht die Seite aus
Grundsätzlich ist die Methode Controller
die folgende
Jeder Parameter string[]
ist eine Spalte in der Tabelle. Die Methode ActivateFlagFor
führt zwei Abfragen nacheinander aus
Folgendes ist das Verhalten:
Ich bin mir sicher, dass dies ein Caching-Problem ist, da das erneute Laden der Anwendung das Problem behebt. Da das Hauptmerkmal der Anwendung vollständig auf SQL basiert, werden Änderungen an Nachschlagetabellen in die Hauptoperation übernommen und das ist das richtige Verhalten.
Ich verstehe, dass das EF-Caching ein großartiges Feature für die Performance ist, aber in meinem Fall möchte ich es einfach nicht, zumindest bis ich die gesamte Anwendung auf LINQ DML migrieren kann (wahrscheinlich unmöglich).
DbContext
Natürlich werden einige von Ihnen fragen: "Wie verwenden Sie Ihren DbContext?" "Verfügen Sie darüber richtig?".
I<Entity>Manager
extending BaseManager
DbContext
ist ein Anforderungsbereichs-Spring-Objekt. Ich habe bereits gefragt, ob Objekte mit Anforderungsbereichen verfügbar sind , aber ich habe derzeit eine Problemumgehung implementiert, die zwar schlecht ist, entledigt sich am Ende der Anfrage korrekt dem DbContext. und
%Vor%Detach
scheint das Problem zu lösen, aber ich müsste es auf Dutzende von Entitäten anwenden, um irgendwann in der Zukunft zurückkehren Wenn Sie den Cache von EF6 für den Datenabruf vollständig ignorieren möchten, fügen Sie am Ende Ihrer Abfrage AsNoTracking()
hinzu (bevor Sie ToList()
aufrufen oder irgendetwas anderes ausführen, das die Abfrage ausführen würde.)
Beachten Sie, dass dabei weder der Cache nach vorhandenen Daten überprüft noch die Ergebnisse des Datenbankaufrufs dem Cache hinzugefügt werden. Darüber hinaus erkennt Entity Framework Änderungen an Entitäten, die Sie aus der Datenbank abrufen, nicht automatisch. Wenn Sie Entitäten ändern und sie in der Datenbank speichern möchten, müssen Sie die geänderten Entitäten anhängen, bevor Sie SaveChanges()
aufrufen.
Ihre Methode ist momentan:
%Vor%Es würde sich ändern zu:
%Vor%Wenn Sie an anderen Optionen zum Umgang mit dem Cache von EF interessiert sind, habe ich eine geschrieben Blogpost über EF6 Cache Busting .
Ich hatte auch diese Probleme, aber ich konnte es beheben.
Ich verwende das Repository-Muster und verwende die Standard-DI von .Net Core. Ich habe AddSingleton (...) verwendet, aber es ist falsch, mit DbContext zu verwenden.
Also habe ich zu AddScoped gewechselt, wie ich es aus der Dokumentation gelesen habe: Scoped Lifetime Services werden einmal pro Anfrage erstellt.
Es hat mein Problem gelöst.
Sie müssen diesen Abschnitt von ms lesen Dokumente: Service-Lebenszeiten und Registrierungsoptionen
Tags und Links c# entity-framework linq caching