2010-07-19 69 views
2

考虑以下情形:NHibernate的一个一对多延迟加载工作不正常

A类有一个一对多的关系,以B级 B类有许多一对一关系C类

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

class C { 
    //null 
} 

如果我使用类似

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

一切从数据库中加载B类按预期工作,

但是,如果我这样做:

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

然后,NHibernate的还将从表C中选择并加载所有铯。

以下映射: 的映射......

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

乙映射...

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

什么想法? 谢谢。

+0

你有你的Hibernate的Session仍然当你试图访问延迟加载的集合打开? – Chris 2010-07-20 00:53:21

回答

0

我已经创建了一个示例应用程序来测试您勾勒的场景,但我无法重现Criteria和DetachedCriteria之间的区别,它们都为我返回了相同的结果。

负载是否服从懒属性取决于外连接属性,当它被设置时,我总是得到C急切地加载,当我删除外连接属性时,它懒惰地通过代理加载C.

所以,一个可能的解决办法是改变在B映射到:

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