Deaktivierung der Entity Framework-Proxy-Erstellung

8

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.

    
Tom 15.11.2016, 16:30
quelle

2 Antworten

5

Ä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

    
Sampath 15.11.2016, 16:44
quelle
9

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.

    
Rudi Visser 15.11.2016 17:22
quelle

Tags und Links