2010-12-02 14 views
6

Mit LINQ to Sql können Sie für einen bestimmten Abruf angeben, dass bestimmte untergeordnete Elemente nicht geladen werden sollen (eifrig oder träge). Ist das in NHibernate möglich? Es gibt Zeiten, wenn ich nur das Wurzelobjekt und/oder nur einen Teil des Objektdiagramms haben möchte, und ich würde das gerne spezifizieren können, anstatt ein DTO zu schreiben und ein Mapping durchzuführen, nur um die Tatsache zu umgehen, dass NHibernate sich anfühlt gezwungen, alles zu laden, wenn ich versuche, mein Objekt zu serialisieren.Kann ich Lazy-Loading mit NHibernate selektiv ausschalten?

Danke!

Antwort

5

Ja, aber ...

Die Höhe der Flexibilität, die Sie hier haben auf Ihrer Version von NHibernate abhängen und wie Sie bauen Ihre Anfrage. Zum Beispiel wird eine LINQ-Abfrage (hier ist, wo Versionierung einen Unterschied machen kann) nicht die gleiche Flexibilität wie eine ICriteria oder HQL-Abfrage geben.

Mit der Kriterien-API können Sie .SetFetchMode() aufrufen, die Eigenschaft und den gewünschten Modus für diese Abfrage übergeben.

In NHibernate können Sie auch Projektionen erstellen, sodass Sie Objekte ohne zugeordnete Zuordnung oder DTOs ohne Zuordnung instanziieren können. Natürlich geht eine Projektion nur in eine Richtung; Wenn es nicht zugeordnet ist, kann es nicht beibehalten werden.

+0

Das ist, was ich suche - danke. Ich würde das gerne pro Anfrage machen, anstatt es in der Sammlung zu programmieren. – sydneyos

2

Alles, was Jay schon gesagt, plus Sie können Faulheit in Ihrem Mapping-Dateien angeben ... Sie es auf Klassenebene angeben:

<class name="Foo" lazy="true"> 
    <!-- additional data --> 

oder auf dem Grundstück/Sammlungsebene:

<property Name="Bar" lazy="true"/> 
<set Name="Bars" lazy="true"> <-- makes the collection lazy 
<set Name="Bars" fetch="join"> <-- eagerly fetches child items in the collection 
<set Name="Bars" fetch="select"> <-- fetches items via another select when the collection is accessed for the first time 

Diese Standardwerte können für bestimmte Abfragen überschrieben und von HQL ignoriert werden.

Verwandte Themen