wake-up-neo.net

Wie kann man Entity Framework zwingen, immer aktualisierte Daten aus der Datenbank abzurufen?

Ich verwende EntityFramework.Extended library, um Stapelaktualisierungen durchzuführen. Das einzige Problem ist, dass EF die von der Bibliothek durchgeführten Stapelaktualisierungen nicht nachverfolgt. Wenn ich also erneut DbContext abfrage, werden keine aktualisierten Entitäten 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 die mit AsNoTracking() abgefragten Entitäten nicht nachverfolgt, kann ich die abgefragten Daten jedoch nicht aktualisieren.

Gibt es eine Möglichkeit, EF zu zwingen, die neuesten Daten zu erhalten, während Änderungen nachverfolgt werden?

60
Saravana

Bitte versuchen Sie dies, um eine einzelne Entität zu aktualisieren:

Context.Entry<T>(entity).Reload()

Edit: Um frische Daten für eine Sammlung von Entitäten zu erhalten, ist es wert, die DbContext-Instanz nach jeder Anforderung zu löschen.

114
PlTaylor

Ich stolperte über diese Frage, als ich nach einer Lösung für ein Problem suchte, bei dem die Navigationseigenschaften nach der Aktualisierung der Entität nicht gefüllt waren. Immer wenn ich versuchte, die Entität aus der Datenbank neu zu laden, holte sie stattdessen den Eintrag aus dem lokalen Speicher, der die Navigationseigenschaften nicht durch verzögertes Laden auffüllte. Anstatt den Kontext zu zerstören und einen neu zu erstellen, stellte ich fest, dass ich mit den funktionierenden Proxys neue Daten abrufen konnte:

_db.Entry(entity).State = EntityState.Detached;

Die Logik dahinter war - mein Update hat die Entität angehängt, damit Änderungen daran nachverfolgt werden konnten. Dadurch wird es dem lokalen Speicher hinzugefügt. Danach würden alle Versuche, die Entität mit funktionalen Proxys abzurufen, dazu führen, dass die lokale Entität ergriffen wird, anstatt zur Datenbankbibliothek zu gehen und eine neue, Proxy-aktivierte Entität zurückzugeben. Ich habe die obige Reload-Option ausprobiert, wodurch das Objekt aus der Datenbank aktualisiert wird, aber das Proxy-Objekt wird nicht mit verzögertem Laden angezeigt. Ich habe versucht, eine Find(id), Where(t => t.Id = id), First(t => t.Id = id) zu machen. Schließlich überprüfte ich die verfügbaren Zustände und stellte fest, dass es einen "Detached" -Zustand gab. Eureka! Hoffe das hilft jemandem.

10
Zach

Ich habe die Entitätsvariable ohne Zuweisung als Teil der Klasse deklariert. Dies ermöglichte es mir, über eine Instanz zu verfügen, ohne die Variable durch andere Methoden als Referenz zu verlieren. Ich bin gerade auf dieses Thema gestoßen, so dass es nicht viel Laufzeit unter dem Gürtel hat, 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 ...
}
1
Scooter

Wenn Sie den Code in demselben Kontext ausführen, erhalten Sie keine aktualisierten Entitäten. Es werden nur neue Entitäten angefügt, die in der Datenbank zwischen den Läufen erstellt wurden. EF Force-Laden kann folgendermaßen durchgeführt werden:

ObjectQuery _query = Entity.MyEntity;
_query.MergeOption = MergeOption.OverwriteChanges;
var myEntity = _query.Where(x => x.Id > 0).ToList();
1
CodeMad

Für mich ... Ich greife auf meinen DbContext folgendermaßen zu:

_viewModel.Repo.Context

Um EF zu zwingen, auf die Datenbank zuzugreifen, mache ich folgendes:

_viewModel.Repo.Context = new NewDispatchContext();

Überschreiben des aktuellen DbContext mit einer neuen Instanz. Wenn ich meine Datendienste das nächste Mal verwende, werden die Daten aus der Datenbank abgerufen.

0
pdschuller