Nach dem, was ich gelesen habe, wird durch das Setzen von ProxyCreationEnabled = false
die Änderungsverfolgung und das verzögerte Laden verhindert. Allerdings ist mir nicht klar, was Change Tracking abdeckt.
Wenn ich es deaktiviere und eine Entität aus der Datenbank abrufe, Änderungen daran vornimmt und festschreibe, werden diese Änderungen gespeichert. Ich kann auch noch geänderte Einträge vom ChangeTracker erhalten:
%Vor%Sollte dies möglich sein, wenn ich die Proxy-Erstellung deaktiviert habe? Ich möchte es deaktivieren, aber ich möchte klarstellen, was ich deaktiviere.
Änderungsverfolgung und Proxy-Erstellung sind zwei verschiedene Szenarien. Wenn Sie die Änderungsverfolgung deaktivieren müssen, müssen Sie dies wie unten gezeigt tun.
%Vor% Dann können Sie das nicht tun ChangeTracker.Entries<IAuditable>().Where(x => x.State == EntityState.Modified).ToList()
.
Wenn Sie die Proxy-Erstellung deaktivieren müssen, müssen Sie dies im Konstruktor Ihres Kontexts tun, wie unten gezeigt.
%Vor% Der Proxy-Erstellungsmechanismus wird verwendet, um das verzögerte Laden von Beziehungen zu unterstützen. EF erstellt keine Proxys für Typen, für die der Proxy nichts zu tun hat. Mit anderen Worten, wenn Sie virtual
Eigenschaften für Ihre POCO-Klassen nicht haben, gibt es keine Wirkung, entweder haben Sie sie deaktiviert oder nicht.
Wenn Sie Ihre Entitäten serialisieren, sollten Sie Proxies und Lazy Loading ausschalten, da das Deserialisieren von Proxys schwierig sein kann.
Sie können hier mehr darüber lesen: Entity Framework Working mit Proxies
Ich kann bestätigen, dass ProxyCreationEnabled
in EF auf "false" gesetzt ist, wenn sich nicht auf die Änderungsverfolgung auswirkt. Sie haben mich tatsächlich mit dieser Frage fasziniert, da ich dachte, ich wüsste die Antwort, aber um das zu bestätigen, habe ich einen schnellen Testfall erstellt.
Siehe Beispielcode, der ein gültiges Szenario darstellt:
%Vor% Das einzige, was die Deaktivierung der Proxygenerierung beeinträchtigen könnte, ist die Lazy Loading-Funktionalität von EF, wenn Sie virtual
-Navigationseigenschaften für ein anderes Modell verwenden. Der Change Tracker ist unabhängig und arbeitet vom zugrunde liegenden ObjectContext
selbst.
Für eine vollständige Antwort im Zusammenhang mit der Änderungsverfolgung ist es wahrscheinlich erwähnenswert, dass AutoDetectChangesEnabled
die einzige Einstellung zu sein scheint, die sich direkt auf die Änderungsverfolgungsfunktionalität auswirkt. Sie müssen DetectChanges()
aufrufen, wenn Sie Ihren Beispielcode verwenden müssen.
Tags und Links c# entity-framework