2009-09-15 11 views
0

J'ai un arbre où chaque noeud est une classe de ressources: comme vous pouvez voir cette classeNHibernate one-to-many chargement paresseux quand déjà chargé

public abstract class Resource 
{ 
     public virtual Guid Id { get; set; } 
     public virtual Resource Parent { get; set; } 
     public virtual IList<Resource> ChildResources { get; set; } 
} 

est abstrait et il y a beaucoup de différentes classes dérivées de Ressource (3 en ce moment, plus à venir).

Dans ma base de données j'ai une table pour la ressource, et une table pour chaque classe qui dérive de la ressource. Ceux-ci sont mappés avec <joined-subclass>.

J'ai lu ceci:

http://ayende.com/Blog/archive/2009/08/28/nhibernate-tips-amp-tricks-efficiently-selecting-a-tree.aspx

et j'ai le même code que Ayende pour charger mon arbre:

var resource = UnitOfWork.Current.Session 
    .CreateQuery("from Resource r join fetch r.ChildResources") 
    .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
    .SetReadOnly(true) 
    .List<Resource>(); 

qui est tout fonctionne bien (toutes les ressources sont retournés avec un seul select) Cependant, je vois des sélections supplémentaires survenant lorsque j'énumère la liste ChildResources d'une ressource.

Est-ce à cause de cela ?:

http://ayende.com/Blog/archive/2009/09/03/answer-the-lazy-loaded-inheritance-many-to-one-association-orm.aspx

De toute façon, comment empêcher que cela se produise?

est ici la partie des correspondances pour les relations (noms de classe parés pour plus de clarté):

<bag cascade="save-update" fetch="join" lazy="false" inverse="true" name="ChildResources"> 
     <key> 
       <column name="Parent_Id" /> 
     </key> 
     <one-to-many class="Resource" /> 
</bag> 
<many-to-one class="Resource" name="Parent"> 
     <column name="Parent_Id" /> 
</many-to-one> 

Merci

MISE À JOUR

de surveillance légère, sa seule émission sélectionne supplémentaires lorsque énumérer les collections enfants des nœuds feuilles dans l'arbre ...

+0

Quels sont les voyez-vous sélectionne? – Mark

+0

le premier 'select' avec les' jointures à gauche' pour les 'sous-classes jointes' renvoie toutes les ressources. Les sélections supplémentaires sont ce que je m'attendrais à voir dans une situation de charge paresseuse; 'select from Ressources où parent_id = foo' –

+0

voir ma mise à jour dans le q –

Répondre

0

Ou faire ceci:

<bag ... lazy="false"> 

à aggressif les articles toujours, ou le faire (en HQL):

var resources = session.CreateQuery("from Resource r join fetch r.ChildResources"); 
+0

Lazy = false ne fait aucune différence, et c'est le HQL im using. Quand cette HQL est exécutée, j'obtiens toutes les lignes de ressources retournées par la base de données, super :) mais ... quand j'énumère ChildResources, ça frappe à nouveau la db en faisant "select from Resource où Parent_id =' ' –

+0

J'ai mis à jour la question pour refléter cela, et aussi quelque chose d'autre a découvert –

Questions connexes