Nhibernate: Eager lädt zwei untergeordnete Sammlungen (eine davon ist eine Komponentenliste)

8

Ich habe eine Elternklasse, die zwei untergeordnete Sammlungen hat, ChildCollectionA und ChildCollectionB. ChildCollectionA wird als eine Zuordnung zugeordnet und hat eine eigene ID:

%Vor%

und ChildCollectionB ist zugeordnet hat eine Komponentenliste:

%Vor%

Ich brauche jetzt alle Eltern in der Datenbank, weil ich einige Operationen durchführen muss, die sowohl ChildCollectionA als auch ChildCollectionB benötigen.

Also musste ich sie eifrig laden. Ich benutzte den Fetch-Modus, um zuerst ChildCollectionA zu laden:

var queryParents = session.CreateCriteria () .SetFetchMode ("ChildCollectionA", FetchMode.Eager) .Add (Ausdruck.Le ("ParentDate", endDate));

Es gab 492 Eltern (sollte 481 sein), der Gesamtwert der Operation, die ich durchgeführt habe, war 32.847,46 € (sollte 30.790,87 € sein). Also muss ich übergeordnete Duplikate entfernen:

%Vor%

Ich habe das selbe eifrige Laden mit nur der ChildCollectionB

versucht %Vor% In beiden Fällen zurückgegeben 481 Eltern OK, und der Wert war 30.790,87 € OK.

Aber ich musste beide Sammlungen gleichzeitig laden, ich tat das:

%Vor%

Es gab 481 Eltern in Ordnung, und der Wert war 32.602,57 € (sollte 30.790,87 € sein).

Jetzt ist die Anzahl der zurückgegebenen Eltern korrekt, aber an anderer Stelle gibt es Duplikate, die Werte hängen von den Sammlungen ab und nicht von den Eltern, also müssen die Duplikate irgendwo in den ChildCollections liegen.

Im Moment benutze ich eine hässliche Lösung:

%Vor%

Es gab 481 Eltern in Ordnung, und der Wert war 30.790,87 € OK.

Das Problem passiert, wenn ich eifrig beide Sammlungen laden, wenn ich eifrig nur eine laden will, und dann die Lazyload auf die andere erzwinge, funktioniert das. Ich weiß nicht, ob die Zuordnung von ChildCollectionB als Komponentenliste statt einer Assoziation etwas damit zu tun hat ...

Irgendwelche Hinweise?

Danke

    
Miguel Marques 19.02.2010, 11:16
quelle

1 Antwort

4

Ich glaube, das Problem liegt darin, dass das kartesische Produkt zwischen den beiden Sammlungen nicht vom DistinctRootEntityTransformer behandelt wird. Sie haben also irgendwo Daten in den Sammlungen dupliziert.

Um mehrere Sammlungen schnell laden zu können, werden mehrere Abfragen benötigt.

%Vor%

Normalerweise lese ich die Haupteinheit zusammen mit allen erforderlichen n: 1-Zuordnungen. Dann werde ich die benötigten Sammlungen mit einer MultiCriteria eifrig in die Sitzung holen. Wenn es nur zwei Sammlungen sind, mag ich manchmal oben und hole die erste Sammlung mit distinctroutenity.

Weitere Informationen finden Sie unter Eager Ladeaggregat mit vielen Kindersammlungen

    
dotjoe 19.02.2010, 14:53
quelle

Tags und Links