Nhibernate一对多延迟加载不能按预期工作

时间:2010-07-19 22:34:35

标签: c# nhibernate nhibernate-mapping one-to-many many-to-one

考虑以下情况:

A类与B类有一对多的关系。 B类与C类有多对一的关系。

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

class C {
   //null
}

如果我使用类似

之类的东西从数据库加载B类
   IList<B> result = query.List<B>();

一切都按预期工作,

但是,如果我这样做:

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

然后,NHibernate也将从表C中选择并加载所有Cs。

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

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

B映射......

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

任何想法? 感谢。

1 个答案:

答案 0 :(得分:1)

我创建了一个示例应用来测试您勾勒出的场景,但我无法重现Criteria和DetachedCriteria之间的差异,他们都为我返回了相同的结果。

load是否服从lazy属性依赖于outer-join属性,当它被设置时,我总是急切地加载C,当我删除了外连接属性时,它通过代理延迟加载C。

因此,一种可能的解决方案是将B映射更改为:

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