已加载时NHibernate一对多关系延迟加载

时间:2009-09-15 08:53:08

标签: nhibernate hibernate

我有一棵树,每个节点都是一个Resource类:

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

正如您所看到的,这个类是抽象的,并且有许多来自Resource的不同派生类(目前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>();

这一切都正常(所有资源都返回一个选择)但是,当我枚举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> 

由于

更新

轻微疏忽,在枚举树中叶子节点的子集合时,它只发出额外的选择......

1 个答案:

答案 0 :(得分:0)

要么这样做:

<bag ... lazy="false">

总是急切地获取项目,或者这样做(在HQL中):

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