我有一棵树,每个节点都是一个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>
一起映射。
我读过这个:
我和Ayende有相同的代码加载我的树:
var resource = UnitOfWork.Current.Session
.CreateQuery("from Resource r join fetch r.ChildResources")
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.SetReadOnly(true)
.List<Resource>();
这一切都正常(所有资源都返回一个选择)但是,当我枚举Resource的ChildResources列表时,我看到了额外的选择。
是因为这个吗?:
无论哪种方式,我该如何防止这种情况发生?
这是关系映射的一部分(类名 修剪清晰):
<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>
由于
更新
轻微疏忽,在枚举树中叶子节点的子集合时,它只发出额外的选择......
答案 0 :(得分:0)
要么这样做:
<bag ... lazy="false">
总是急切地获取项目,或者这样做(在HQL中):
var resources = session.CreateQuery("from Resource r join fetch r.ChildResources");