Wenn ich über meinen ObjectContext verfüge, werden meine Entitäten getrennt?

8

Mit anderen Worten, wenn ich Entitäten abrufe und meinen ObjectContext entsorge, muss ich alle meine Entitäten explizit trennen?

    
Fernando 23.06.2011, 15:52
quelle

3 Antworten

7

Vielleicht hängt es von der Bedeutung von Detach ab. Angehängte Entität bedeutet, dass der Kontext die Entität kennt und ihre Änderungen verfolgt. Wenn Sie den Kontext entsorgen, kann er keine Änderungen mehr verfolgen und die Entität ist wie losgelöst. Das Gleiche hat hier eine echte Bedeutung.

Wenn Sie dynamische Proxies verwenden (POCO - dynamic change tracking oder lazy loading), behält der Proxy selbst einen internen Rückwärtsverweis auf den Kontext, reagiert jedoch nicht auf die Kontextverwendung. Es behält immer noch den Verweis (übrigens. Dies kann Quelle von einigen unangenehmen Speicherlecks sein). Dies verursacht ein Problem in zwei Situationen:

  • Wenn Sie versuchen, eine solche Entität an einen anderen Kontext anzuhängen, wird eine Ausnahme ausgelöst, dass die Entität nur durch einen einzelnen Kontext verfolgt werden kann (trotz der Tatsache, dass der ursprüngliche Kontext bereits tot ist).
  • Wenn Sie versuchen, auf die Navigationseigenschaft zuzugreifen, die nicht geladen wurde, erhalten Sie ObjectDisposedException , weil der Proxy einen verzögerten Ladevorgang für den entsorgten Kontext auslöst.

Die einzige Möglichkeit, dies zu vermeiden, besteht entweder darin, dynamische Proxies zu deaktivieren oder die Entität manuell abzutrennen, bevor der Kontext freigegeben wird. Dies hat einen weiteren Nachteil - das Trennen der Entity bricht die Beziehungen.

    
Ladislav Mrnka 23.06.2011 19:08
quelle
5

Nein, du musst nicht auf deine Entitäten loslassen. Wenn Sie jedoch etwas tun wie:

%Vor%

und dann über Ihren Kontext verfügen, wird eine Ausnahme ausgelöst, da IEnumerable die Ausführung verzögert hat. Tun Sie dies:

%Vor% Mit

können Sie weiterhin Ihre Personenliste verwenden.

Weiter,

%Vor%

funktioniert, nachdem der Kontext entfernt wurde, weil Sie eine bestimmte Entität und keine Enumeration abgerufen haben.

    
taylonr 23.06.2011 16:02
quelle
2

Ihre Entitäten werden getrennt, sobald der Kontext entsorgt wird. Siehe den folgenden Beitrag:

Entity Framework-Kontexte für mehrere Objekte

    
Maciej 23.06.2011 16:02
quelle

Tags und Links