Wie funktioniert Entity Framework mit rekursiven Hierarchien? Include () scheint damit nicht zu funktionieren

c# entity-framework visual-studio-2008

Frage

Ich habe einen Item . Item hat eine Category .

Category hat ID , Name , Parent und Children . Parent und Children gehören ebenfalls zur Category .

Wenn ich eine LINQ to Entities-Abfrage für ein bestimmtes Item , wird die zugehörige Category , es sei denn, ich verwende die Include("Category") Methode Include("Category") . Es bringt jedoch nicht die gesamte Kategorie mit Eltern und Kindern. Ich könnte Include("Category.Parent") , aber dieses Objekt ist so etwas wie ein Baum, ich habe eine rekursive Hierarchie und weiß nicht, wo es endet.

Wie kann EF veranlasst werden, die Category vollständig mit Eltern und Kindern und den Eltern mit Eltern und Kindern usw. zu laden?

Dies gilt nicht für die gesamte Anwendung. Aus Gründen der Leistung wäre dies nur für diese bestimmte Entität, die Kategorie, erforderlich.

Akzeptierte Antwort

Anstelle der Include Methode können Sie auch Load .

Sie könnten dann für jeden einen und alle Kinder durchlaufen und ihre Kinder laden. Dann machen Sie einen für jeden durch ihre Kinder und so weiter.

Die Anzahl der Stufen, die Sie verlassen, wird in der Anzahl der Schleifen, die Sie haben, hart codiert.

Hier ein Beispiel für die Verwendung von Load : http://msdn.microsoft.com/de-de/library/bb896249.aspx


Beliebte Antwort

Wenn Sie definitiv möchten, dass die gesamte Hierarchie geladen wird, würde ich, wenn ich es wäre, versuchen, eine gespeicherte Prozedur zu schreiben, deren Aufgabe es ist, alle Elemente in einer Hierarchie zurückzugeben, und denjenigen zurückgeben, nach dem Sie zuerst gefragt sind (und dessen untergeordnete Elemente).

Und dann lassen Sie die Beziehungskorrektur der EF sicherstellen, dass sie alle miteinander verbunden sind.

dh etwas wie:

// the GetCategoryAndHierarchyById method is an enum
Category c = ctx.GetCategoryAndHierarchyById(1).ToList().First();

Wenn Sie Ihre gespeicherte Prozedur richtig geschrieben haben, sollten alle Elemente in der Hierarchie (z. B. ToList() ) verwirklicht werden.

Und dann sollte das gewünschte Element (First ()) alle Kinder geladen haben, und die Kinder sollten geladen sein. Alle werden von diesem einen gespeicherten Prozeduraufruf ausgefüllt, also auch keine MARS-Probleme.

Hoffe das hilft

Alex



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum