2011-01-03 3 views
2

ich die folgenden Tabellen:Wie mehrere 1-Beziehung zur Verknüpfung von Tabellen haben mit NHibernate

  1. Anwendung
  2. Komponente
  3. Position

Eine Anwendung 1 bis viele Komponenten haben können Eine Anwendung kann 1 bis viele Positionen haben.

Wenn ich versuche, eine wie dies mit NHibernate zu laufen beitreten:

IEnumerable<Application> applications = Session.Query<Application>() 
    .FetchMany(r => r.Components) 
    .FetchMany(r => r.Positions) 

und ich an den Positionen sehen geben Sie es doppelte Positionen hat. Dies geht weg, wenn ich das erste FetchMany() entfernen:

IEnumerable<Application> applications = Session.Query<Application>() 
    .FetchMany(r=>r.Positions) 

Ich dachte, NHibernate kümmert sich um Ihre Sammlungen zu normalisieren, wenn mehrere tut 1 zu viele schließt sich, aber es scheint nicht zu funktionieren.

Gibt es Vorschläge oder Problemumgehungen, wie ich mehrere Verknüpfungen von 1 zu vielen mithilfe von NHibernate LINQ ausführen kann, ohne diese doppelten Datensätze zu erhalten?

+0

Gibt es eine Beziehung zwischen Komponenten und Positionen? –

+0

@ John Weldon - nein – leora

+0

Diese Antwort könnte von Interesse sein http://stackoverflow.com/questions/2295837/nhibernate-problem-eager-loading-two-child-collections-one-bein-a-component-li/2297156 # 2297156 – dotjoe

Antwort

2

Dies ist keine Lösung, sondern eine Workaround, die besser funktioniert als eine Lösung.

Separate Abfragen werden wahrscheinlich bessere Ergebnisse liefern als eine große Abfrage, weil sie weniger Daten abrufen. Sie können

ApplicationColumns ComponentColumns PositionColumns 
AppA    ColA    PosA 
AppA    ColB    PosA 
AppA    ColA    PosB 
AppA    ColB    PosB 
AppB    ColC    PosC 
AppB    ColD    PosC 
AppB    ColC    PosD 
AppB    ColD    PosD 

Drei kleine Ergebnismengen durch die Verwendung .Future()

Ein großes Ergebnisses Set mit 2 Apps mit 2-Komponenten und 2 Positionen = 24 Elementen, die einzelnen Abfragen auf einmal ausführen mit 2 Apps mit 2-Komponenten und 2 Positionen = 10 Elemente

ApplicationColumns 
AppB 
AppB 

ComponentColumns 
ColA 
ColB 
ColC 
ColD 

PositionColumns 
PosA 
PosB 
PosC 
PosD 

Wählen Sie N + 1 und Outer Join sind nicht die einzige Wahl.

+0

danke, wie ich Ihre Punkte oben schätzen. Wenn Sie mehrere Abfragen mit future ausführen, wie erhalten Sie sie als einzelnes Objektdiagramm wieder zusammen, da ich eine Tabelle anzeigen möchte, die eine einzelne Zeile mit AppName, Komponenteninfo und Positionsinformationen anzeigt. – leora

+0

Wenn die Objekte verknüpft sind, werden die Objektgraphen automatisch von NHiberante im Speicher erstellt.Ich schätze 2 Abfragen (erhöht das Ergebnis auf 16 Elemente) funktionieren am besten für die beschriebene Situation: Laden Sie Apps mit abgerufenen Spalten und Laden Sie Apps mit abgerufenen Positionen. – Paco

+0

ich folge immer noch nicht ganz. In diesem Fall würden Sie zwei Ergebnisse zurückbekommen (eines für jede Abfrage). Jedes Ergebnis wäre eine Liste von Apps (eine würde eine vollständige Verknüpfung mit Komponenten enthalten und eine würde eine vollständige Verknüpfung mit Positionen enthalten). Wenn ich eine Schleife durch die App-Liste machen und sowohl Komponenten- als auch Positionsinformationen herausziehen möchte, sagen Sie, dass Nhibernate beiden Ergebnissen erlaubt, sowohl Komponenteninformationen als auch Positionsinformationen zu lesen, ohne in die Datenbank zurückzukehren? – leora

0

Werfen Sie einen Blick auf Ergebnistransformatoren. Sie sollten in der Lage sein, dies Ihrer Abfrage hinzuzufügen und die doppelten Einträge loszuwerden.

SetResultTransformer(CriteriaSpecification.DistinctRootEntity) 

Sie sollten auch die FetchMany-Methoden verlassen können, wenn Sie Lazy-Loading verwenden möchten. Es könnte jedoch dazu führen, dass viele Abfragen ausgeführt werden.

+0

Ich möchte Lazy Loading wegen der mehreren Abfragen vermeiden – leora

+0

Ah ok, sollte der Transformator noch Lazy-Loading verhindern, obwohl ich mir nicht 100% sicher bin. Probieren Sie es aus und lassen Sie es mich wissen. –

Verwandte Themen