Warum setzt EntityState auf Detached Leeren Sie eine Eigenschaft vom Typ ListT?

8

Entity Framework Code verwenden Zuerst habe ich etwas wie:

%Vor%

Warum bewirkt das Entfernen eines Objekts, dass seine Eigenschaft public List<string> Bars , die explizit und erfolgreich eingeschlossen wurde, geleert wird?

Was ist die korrekte Prozedur, um ein Objekt zu lösen, das viele Eigenschaften haben kann?

    
Eric J. 26.04.2012, 22:42
quelle

1 Antwort

9

Der Grund, warum die Liste geleert wird, ist eine Kombination von zwei Regeln in Entity Framework:

  1. Wenn Sie ein Objekt trennen, wird nur dieses Objekt selbst ohne die Objekte entfernt, auf die sich die Navigationseigenschaften beziehen.

  2. Das ObjectContext / DbContext erlaubt es nicht, ein Objektdiagramm zu halten, das teilweise an den Kontext angehängt und teilweise losgelöst ist. Obwohl dies bei der Verwendung von POCOs als temporärer Zustand passieren kann, wird EF diesen temporären Zustand immer beheben, indem er automatisch gelöschte Objekte im Graphen innerhalb verschiedener Methoden anfügt (wie Add , Attach , den Zustand einer Entität setzt usw.). oder spätestens, wenn SaveChanges aufgerufen wird.

Das heißt, wenn Sie das Stammobjekt vom Kontext trennen, löscht EF die Liste der untergeordneten Elemente, weil: a) die untergeordneten Elemente angefügt bleiben (Regel 1) und b) eine Mischung aus gelösten und angehängten Objekten im Diagramm nicht vorhanden ist erlaubt (Regel 2).

Soweit ich das beurteilen kann, gibt es keine Möglichkeit, ein Objektdiagramm aus dem Kontext zu lösen, während die ursprüngliche Baumstruktur beibehalten wird. Sie können die Eltern und dann die Kinder nacheinander trennen. Als Ergebnis haben Sie alle Objekte des Baums aus dem Kontext entfernt, aber gleichzeitig wird der Baum zerstört - jede Navigationseigenschaft wird annulliert.

Der Hauptzweck des manuellen Entfernens von Entitäten besteht darin, sie für die Garbage-Collection in Situationen freizugeben, in denen Speicherbeschränkungen bestehen und eine große Anzahl von Objekten im Kontext nicht gespeichert werden soll. Zu diesem Zweck spielt es keine Rolle, dass die Graphenstruktur zerstört wird.

Ich weiß nicht, warum Sie Objekte aus dem Kontext lösen müssen. Beachten Sie jedoch, dass es auch die Möglichkeit gibt, Entitäten aus der Datenbank zu laden, ohne sie an den Kontext anzuhängen, wie zum Beispiel AsNoTracking() .

Eine weitere Antwort zum Problem mit einigen Verweisen auf die MSDN-Dokumentation finden Sie hier: Ссылка

    
Slauma 27.04.2012, 00:22
quelle