10

Ich arbeite mit einem großen hierarchischen Datensatz in SQL Server - modelliert mit dem Standard "EntityID, ParentID" Ansatz. Es gibt ungefähr 25.000 Knoten im ganzen Baum.Wie verwende ich Entity Framework mit hierarchischen Daten?

Ich muss oft auf Teilbäume des Baumes zugreifen und dann auf verwandte Daten zugreifen, die an den Knoten des Teilbaums hängen. Ich habe vor einigen Jahren eine Datenzugriffsschicht basierend auf Tabellenwertfunktionen erstellt, wobei rekursive Abfragen verwendet wurden, um eine beliebige Unterstruktur abzurufen, wenn der Wurzelknoten des Unterbaums verwendet wurde.

Ich denke Entity Framework zu verwenden, aber ich kann nicht sehen, wie hierarchische Daten wie dies abfragen. AFAIK gibt es keine rekursive Abfrage in Linq, und ich kann eine TVF in meinem Entity-Datenmodell nicht verfügbar machen.

Ist die einzige Lösung, gespeicherte Procs zu verwenden? Hat jemand anderes das gelöst?

Erläuterung: Bei 25.000 Knoten im Baum verweise ich auf die Größe des hierarchischen Datasets, nicht auf irgendetwas, was mit Objekten oder dem Entity Framework zu tun hat.

Antwort

6

Es ist am besten, ein Muster namens "Nested Set" zu verwenden, mit dem Sie innerhalb einer Abfrage einen beliebigen Teilbaum erhalten. Dies ist besonders nützlich, wenn die Knoten nicht sehr oft manipuliert werden: Managing hierarchical data in MySQL.

In einer perfekten Welt würde das Entity-Framework die Möglichkeit bieten, Daten mit diesem Datenmuster zu speichern und abzufragen.

+0

Der Link ist leider jetzt tot – Oskar

+0

@Oskar: Die Seite ist jetzt auf der Website des Autors verfügbar, ich habe den Link aktualisiert. –

0

Alles ist möglich mit Entity Framework, aber Sie müssen sich hacken und schlitzen Sie hinein. Die Datenbank, gegen die ich derzeit arbeite, hat zu viele "Haltetabellen", da beispielsweise Punkte sowohl mit Teams als auch mit Benutzern geteilt werden. Sowohl Benutzer als auch Teams können einen Blog erstellen.

Wenn Sie 25.000 Knoten meinen, meinen Sie Navigationseigenschaften? Wenn dem so ist, könnte es schwierig sein, den Datenzugriff an Ort und Stelle zu bekommen. Es ist nicht schwer, mit dem Entity-Framework zu navigieren, zu suchen, aber ich neige dazu, auf dem Papier zu modellieren und dann die Datenbank basierend darauf zu erstellen, wie ich navigieren möchte, während ich das Entity-Framework nutze. Klingt, als hättest du diese Option nicht.

+0

Danke. In meinem Szenario wird die Hierarchie (Baum) mit nur einer einzigen Tabelle modelliert, in der jede Zeile Daten über den Knoten und seine Elternknoten-ID enthält. – jamesfm

0

Vielen Dank für diese Vorschläge.

Ich beginne zu erkennen, dass die Antwort darin besteht, die Daten in der Datenbank umzugestalten - entweder in Form von verschachtelten Mengen, wie Georg es vorschlägt, oder vielleicht einer transitiven Schließungstabelle, die ich gerade gesehen habe.

Auf diese Weise hoffe ich zwei wesentliche Vorteile zu erhalten:

a) schneller anfragende Aginst beliebige Teilbäume

b) ein Datenmodell, das nicht mehr rekursive Abfragen erfordert - so vielleicht ist es leicht zu bringen Reichweite des Entity Framework!

Es ist immer wieder erstaunlich, wie so oft die richtige Antwort auf ein schwieriges Problem ist, es nicht zu beantworten, sondern stattdessen etwas anderes zu tun!