我有这种情况:
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。就像延迟加载不起作用。
我的问题是:
谢谢,
答案 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),但也许你可以找到一些示例代码。