2010-12-16 7 views
1

Ich habe gerade mein Projekt auf NHibernate 3.0 aktualisiert, und ich versuche, einige meiner Kriterienanweisungen in LINQ-Anweisungen zu konvertieren. Alles scheint gut zu funktionieren, außer dass die neuen LINQ-Anweisungen die Abrufregeln, die ich in meinen Mapping-Dateien (mit FluentNHibernate) deklariert habe, nicht zu beachten scheinen.Werden globale Abrufregeln vom LINQ-Anbieter in NHibernate 3.0 berücksichtigt?

Zum Beispiel:

public UserMap 
{ 
    Id(x => x.Id); 
    References(x => x.Course).Fetch.Join(); 
} 

Jetzt Abfrage ich alle Benutzer wie folgt aus:

var users = Session.Query<User>().ToList(); 

ich die Sammlung zurückgegeben erwarten würden alle Nutzer in der Datenbank mit ihren Kurs Eigenschaften mit Spannung geladen zu sein, Genau das würde ich bei der Verwendung von Criteria-Anweisungen erhalten. Bei der Verwendung des LINQ-Anbieters enthält die von NH erzeugte Abfrage jedoch nicht den Join in der Tabelle "Course", so dass alle Kurse nur langsam geladen werden können. Wird dieses Verhalten erwartet? Wenn ja, wie kann ich erreichen, dass NHibernate Abrufregeln berücksichtigt, die in den Mappings deklariert sind?

Antwort

0

Nein, tun sie nicht. Sie müssen explizit das explizite Abrufen angeben, indem Sie Fetch/ThenFetch und FetchMany/ThenFetchMany verwenden.

+1

Dies ist unmöglich für mich, weil ich die IQueryable als eine Eigenschaft auf einer IDataContext-Schnittstelle, die von meinem Web-Projekt verwendet wird (die keinen Bezug zu NHibernate und sollte nicht über das Abrufen von Strategien sowieso keine Sorge). – funlambda

1

Ich habe das gleiche Problem und eine ähnliche Lösung Ansatz mit Spezifikationen an das Repository gesendet. Jede Spezifikation hat einen Lamda-Ausdruck, der ein Kriterium angibt. Der vorherige Linq-Anbieter respektierte die Zuordnungen, warum nicht die neue? Oder zumindest standardmäßig die Mappings definiert mit einer Möglichkeit zu überschreiben? Gibt es eine Möglichkeit, diesen Mangel zu beheben?

Verwandte Themen