参考实体的Nhinerbate延迟加载(Nhinerbate lazy loading of ref

2019-10-30 12:06发布

我有这样的场景:

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指定为每一条线。 就像懒加载不工作。

我的问题是:

  1. 如何让我的lazyload在这里工作?
  2. 我可以带在A单位和B实体在一个单一的查询?

谢谢,

Answer 1:

延迟加载默认情况下开启,并应实际工作。 如果有将是一个问题,例如,如果它无法生成B级代理,它会创建会话工厂时抱怨。

你确定为B中的查询通过查询本身完成,并且不会对随后的访问?

你可以优化接入到B两种方式:在一个单一的查询与取在一起他们。 (我不知道流畅,这是XML的方式来配置它:)

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

这与列表中使用,也可以炸毁查询了很多,当一些问题。 这当然不是延迟加载在所有。

另外,非常漂亮和强大的优化是批量抓取。 它允许情况下,在单独的查询中获取,但取其中几个一次。

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

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

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


Answer 2:

扩大对Stafan的建议,使用批量大小,快速谷歌搜索显示,功能NHibernate现在支持为BATCHSIZE查询。 从文档:

ClassMap<T> BatchSize(int size) 

Sets the query batch size for this entity.

从来没有使用过自己,和文档是最小的(像很多FNH),但也许你可以找到一些示例代码。



文章来源: Nhinerbate lazy loading of reference entity