我有这样的场景:
class A
{
public virtual int Id { get; set; }
public virtual B Child { get; set; }
}
class B
{
public virtual int Id { get; set; }
}
在A类的映射,我要B类的引用:
map.Reference(a => a.Child).LazyLoad();
现在,当我做这样的事情:
Session.Query<TypeOfA>().Select(a => a);
除了正常的SELECT * FROM ATable我从BTABLE n指定为每一条线。 就像懒加载不工作。
我的问题是:
- 如何让我的lazyload在这里工作?
- 我可以带在A单位和B实体在一个单一的查询?
谢谢,
延迟加载默认情况下开启,并应实际工作。 如果有将是一个问题,例如,如果它无法生成B级代理,它会创建会话工厂时抱怨。
你确定为B中的查询通过查询本身完成,并且不会对随后的访问?
你可以优化接入到B两种方式:在一个单一的查询与取在一起他们。 (我不知道流畅,这是XML的方式来配置它:)
<many-to-one fetch="join" ...>
这与列表中使用,也可以炸毁查询了很多,当一些问题。 这当然不是延迟加载在所有。
另外,非常漂亮和强大的优化是批量抓取。 它允许情况下,在单独的查询中获取,但取其中几个一次。
<class name="B" batch-size="20" ...>
这一次在一个查询中获取20分B的。 它也可用于列表:
<one-to-many fetch-size="20" ...>
扩大对Stafan的建议,使用批量大小,快速谷歌搜索显示,功能NHibernate现在支持为BATCHSIZE查询。 从文档:
ClassMap<T> BatchSize(int size)
Sets the query batch size for this entity.
从来没有使用过自己,和文档是最小的(像很多FNH),但也许你可以找到一些示例代码。