2010-12-02 20 views
6

Avec LINQ to Sql, vous pouvez spécifier, pour une extraction donnée, que vous ne voulez pas que des éléments enfants spécifiques soient chargés (avec empressement ou paresseusement). Est-ce possible dans NHibernate? Il y a des moments où je veux juste l'objet racine et/ou seulement une partie du graphe d'objet, et j'aimerais pouvoir le spécifier plutôt que d'avoir à écrire un DTO et faire du mapping juste pour contourner le fait que NHibernate ressent obligé de tout charger si je tente de sérialiser mon objet.Puis-je désactiver sélectivement le chargement paresseux avec NHibernate?

Merci!

Répondre

5

Oui, mais ...

Le niveau de flexibilité que vous avez ici peut dépendre de votre version de NHibernate et comment vous construisez votre requête. Par exemple, une requête LINQ (ici où le versioning peut faire la différence) ne vous donnera pas la même flexibilité qu'une requête ICriteria ou HQL.

Avec l'API de critères, vous pouvez appeler .SetFetchMode(), en passant la propriété et le mode souhaité pour cette requête. NHibernate vous permet également de créer des projections, de sorte que vous pouvez instancier des objets de types non mappés ou de DTO sans mappage. Bien sûr, une projection ne va que dans un seul sens; s'il n'est pas mappé, il ne peut pas être conservé.

+0

C'est ce que je cherche - merci. Je voudrais faire cela par demande plutôt que de le coder en dur dans la collection. – sydneyos

2

Tout ce que Jay a déjà dit, plus vous pouvez spécifier la paresse dans vos fichiers de mapping ... Vous pouvez le spécifier au niveau de la classe:

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

ou à la propriété/niveau de la collection:

<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 

Ces valeurs par défaut peuvent être remplacées pour des requêtes spécifiques et sont ignorées par HQL.