Ich verwende die EntityFramework.Extended- Bibliothek, um Stapelaktualisierungen durchzuführen. Das einzige Problem ist, dass EF die von der Bibliothek durchgeführten Stapelaktualisierungen nicht verfolgt. Wenn ich das DbContext
erneut abfrage, werden die aktualisierten Entitäten nicht zurückgegeben.
Ich habe festgestellt, dass die Verwendung der AsNoTracking()
Methode beim Abfragen das Tracking deaktiviert und frische Daten aus der Datenbank abruft. Da EF jedoch die abgefragten Entitäten nicht verfolgt, kann AsNoTracking()
ich keine Aktualisierung der abgefragten Daten durchführen.
Gibt es eine Möglichkeit, EF zu zwingen, die neuesten Daten abzurufen, während Änderungen verfolgt werden?
c#
asp.net-mvc
entity-framework
dbcontext
Saravana
quelle
quelle
Antworten:
Bitte versuchen Sie dies, um eine einzelne Entität zu aktualisieren:
Bearbeiten: Um neue Daten für eine Sammlung von Entitäten zu erhalten, sollten Sie versuchen, die
DbContext
Instanz nach jeder Anforderung zu entsorgen .quelle
DbSet
.Ich bin auf diese Frage gestoßen, als ich nach einer Lösung für ein Problem gesucht habe, bei dem die Navigationseigenschaften nach dem Aktualisieren der Entität nicht ausgefüllt wurden. Immer wenn ich versuchte, die Entität aus der Datenbank neu zu laden, wurde stattdessen der Eintrag aus dem lokalen Speicher abgerufen, wodurch die Navigationseigenschaften nicht durch verzögertes Laden aufgefüllt wurden. Anstatt den Kontext zu zerstören und einen neu zu erstellen, konnte ich auf diese Weise neue Daten mit den funktionierenden Proxys abrufen:
Die Logik dahinter war - mein Update hat die Entität angehängt, damit Änderungen daran nachverfolgt werden können. Dies fügt es dem lokalen Geschäft hinzu. Danach würde jeder Versuch, die Entität mit funktionalen Proxys abzurufen, dazu führen, dass sie die lokale Entität greift, anstatt zur Datenbank zu gehen und eine neue, Proxy-fähige Entität zurückzugeben. Ich habe oben die Option zum erneuten Laden ausprobiert, mit der das Objekt aus der Datenbank aktualisiert wird. Das Proxy-Objekt wird jedoch nicht verzögert geladen. Ich habe versucht, eine
Find(id), Where(t => t.Id = id), First(t => t.Id = id)
. Schließlich überprüfte ich die verfügbaren Zustände, die bereitgestellt wurden, und stellte fest, dass es einen "getrennten" Zustand gab. Eureka! Hoffe das hilft jemandem.quelle
Wenn Sie den Code im selben Kontext ausführen, erhalten Sie keine aktualisierten Entitäten. Es werden nur neue Entitäten angehängt, die zwischen den Läufen in der Datenbank erstellt wurden. EF Force Reload kann folgendermaßen durchgeführt werden:
ObjectQuery _query = Entity.MyEntity; _query.MergeOption = MergeOption.OverwriteChanges; var myEntity = _query.Where(x => x.Id > 0).ToList();
quelle
Ich habe die Entitätsvariable ohne Zuweisung als Teil der Klasse deklariert. Dadurch konnte ich eine Instanz entsorgen, ohne die Variable als Referenz für andere Methoden zu verlieren. Ich bin gerade darauf gestoßen, damit es nicht viel Laufzeit gibt, aber bisher scheint es gut zu funktionieren.
public partial class frmMyForm { private My_Entities entity; public frmMyForm() { InitializeComponent(); } private void SomeControl_Click(object sender, EventArgs e) { db.SaveChanges(); db.Dispose(); entity = new My_Entities(); //more code using entity ... }
quelle
Für mich ... Ich greife wie folgt auf meinen DbContext zu:
Um EF zu zwingen, auf die Datenbank zuzugreifen, gehe ich folgendermaßen vor:
_viewModel.Repo.Context = new NewDispatchContext();
Überschreiben des aktuellen DbContext mit einer neuen Instanz. Wenn ich dann das nächste Mal meine Datendienste benutze, erhalten sie die Daten aus der Datenbank.
quelle