2010-07-19 7 views
2

Envisagez le scénario suivant:Nhibernate un à plusieurs lazy loading ne fonctionne pas comme prévu

classe A a un à-plusieurs à la classe B. classe B a beaucoup à une relation à classe C.

class A { 
    IList<B> BList {get;set;} 
} 
class B { 
    C CMember{get;set;} 
} 

class C { 
    //null 
} 

Si je charge la classe B de la base de données en utilisant quelque chose comme

IList<B> result = query.List<B>(); 

tout fonctionne comme prévu,

Cependant, si je fais quelque chose comme:

DetachedCriteria query = DetachedCriteria.For(typeof(A)); 
    query.CreateAlias("B", "B", JoinType.InnerJoin); 
    IList<A> result = query.List<A>(); 

puis, NHibernate sélectionnera également à partir du tableau C et charger tous les Cs.

Mappages ci-dessous: Une cartographie ...

<bag name="BList " table="B" lazy="true" inverse="false"> 
    <key column="id" /> 
    <one-to-many class="B" /> 
    </bag> 

mapping B ...

<many-to-one class="C" name="CMember" column="idC" lazy="proxy" outer-join="true" /> 

Des idées? Merci.

+0

Vous avez obtenu votre session de mise en veille prolongée encore ouvert lorsque vous essayez d'accéder aux collections paresseux chargé? – Chris

Répondre

0

J'ai créé un exemple d'application pour tester le scénario que vous décrivez et je n'ai pas réussi à reproduire une différence entre les critères et les critères détachés, ils ont tous les deux retourné le même résultat pour moi. Que la charge obéisse ou non à la propriété fainéante dépendait de l'attribut de jointure externe, quand elle est définie, j'ai toujours obtenu un chargement rapide de C, lorsque j'ai supprimé l'attribut de jointure externe par le biais d'un proxy.

donc une solution possible est de changer la cartographie B:

<many-to-one class="C" name="CMember" column="idC" lazy="proxy"/> 
Questions connexes