2009-09-15 24 views
0

我有一棵树,每一个节点是资源类:NHibernate的一个一对多的关系,延迟加载的时候就已经加载

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

,你可以看到这个类是抽象的,也有来自许多不同的派生类资源(目前3个,更多)。

在我的数据库中,我有一个资源表,以及 从Resource派生的每个类的表。这些映射在一起<joined-subclass>

我读过这样的:

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

和我有相同的代码Ayende加载我的树:

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

这是所有工作的罚款(所有的资源都可返回一个选择)但是,我看到额外的选择发生,因为我枚举资源的ChildResources列表。

就是因为这一点,?:

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

无论哪种方式,我该如何避免这种情况的发生?

这里的(修剪为清楚起见类名 )的关系的映射的一部分:

<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> 

感谢

UPDATE

稍有疏忽,其仅发行额外的选择时枚举树中叶节点的子集合...

+0

什么是你看到的选择? – Mark 2009-09-15 10:49:04

+0

'joined-subclasses'的'left join'的第一个'select'返回所有资源。额外的选择是我期望在懒惰负载情况下看到的; '选择资源where parent_id = foo' – 2009-09-15 12:18:21

+0

看到我的更新q – 2009-09-15 12:29:46

回答

0

做这一点:

<bag ... lazy="false"> 

到预先抓取物品始终,或做到这一点(在HQL):

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

lazy = false没有区别,这就是我使用的HQL。当这个HQL被执行时,我得到了所有从数据库返回的资源行,但是:)当我枚举ChildResources时,它再次点击数据库“从资源中选择Parent_id ='' – 2009-09-15 09:21:23

+0

我更新了问题反映这一点,还有其他一些发现 – 2009-09-15 12:30:19