Nhinerbate延迟加载引用实体

时间:2010-11-24 12:34:05

标签: nhibernate fluent-nhibernate

我有这种情况:

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);

除了来自ATable的正常select *之外,我从每个A线的BTable中选择n。就像延迟加载不起作用。

我的问题是:

  1. 如何让lazyload在这里工作?
  2. 我可以将A实体和B实体放在一个查询中吗?
  3. 谢谢,

2 个答案:

答案 0 :(得分:3)

默认情况下启用延迟加载,实际上应该可以正常工作。如果存在问题,例如,如果它无法为B类生成代理,则在创建会话工厂时会抱怨。

您确定B的查询是由查询本身完成的,而不是后续访问A吗?

您可以通过两种方式优化对B的访问:在单个查询中将其与A一起获取。 (我不知道流利,这是配置它的xml方式:)

<many-to-one fetch="join" ...>

与列表一起使用时会出现一些问题,并且可能会使您的查询大量增加。它当然不是延迟装载。

另一个非常好的和强大的优化是批量提取。它允许在单独的查询中获取实例,但同时获取其中的几个。

<class name="B" batch-size="20" ...>

这将在一次查询中一次获取20个B。它也可用于列表:

<one-to-many fetch-size="20" ...>

答案 1 :(得分:0)

扩展Stafan建议使用批量大小的快速Google搜索显示,Fluent NHibernate现在支持BatchSize查询。来自文档:

ClassMap<T> BatchSize(int size) 

Sets the query batch size for this entity.

我自己从不使用它,文档很少(像很多FNH),但也许你可以找到一些示例代码。