Nhibernate Nhinerbate引用实体的延迟加载

Nhibernate Nhinerbate引用实体的延迟加载,nhibernate,fluent-nhibernate,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<T

我有这样一个场景:

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);
Session.Query().Select(a=>a);
除了正常的select*from ATable外,我从BTable中为每一行选择n个选项。就像是懒惰加载不起作用

我的问题是:

  • 我如何让懒虫在这里工作
  • 我可以在单个查询中引入A实体和B实体吗
    谢谢,

    默认情况下,延迟加载是打开的,应该可以正常工作。如果出现问题,例如,如果它不能为类B生成代理,它将在创建会话工厂时发出抱怨

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

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

    
    
    这在与列表一起使用时会出现一些问题,并且可能会使您的查询变得非常复杂。当然,这根本不是延迟加载

    另一个非常好且功能强大的优化是批量抓取。它允许在单独的查询中获取实例,但同时获取多个实例

    <class name="B" batch-size="20" ...>
    
    
    
    这将在一次查询中同时获取20个B。也可用于以下列表:

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

    默认情况下,延迟加载处于打开状态,应该可以正常工作。如果出现问题,例如,如果它不能为类B生成代理,它将在创建会话工厂时发出抱怨

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

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

    
    
    这在与列表一起使用时会出现一些问题,并且可能会使您的查询变得非常复杂。当然,这根本不是延迟加载

    另一个非常好且功能强大的优化是批量抓取。它允许在单独的查询中获取实例,但同时获取多个实例

    <class name="B" batch-size="20" ...>
    
    
    
    这将在一次查询中同时获取20个B。也可用于以下列表:

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

    在Stafan关于使用批量大小的建议的基础上,一个快速的谷歌搜索显示Fluent NHibernate现在支持查询的批量大小。从文档中:

    ClassMap<T> BatchSize(int size) 
    
    Sets the query batch size for this entity.
    
    ClassMap批处理大小(int-size)
    设置此实体的查询批量大小。
    

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

    扩展Stafan关于使用批量大小的建议,快速谷歌搜索显示Fluent NHibernate现在支持查询的批量大小。从文档中:

    ClassMap<T> BatchSize(int size) 
    
    Sets the query batch size for this entity.
    
    ClassMap批处理大小(int-size)
    设置此实体的查询批量大小。
    

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

    @Tom:这不是真的。还有另一个批处理大小,可以在配置中设置,并使用ADO.NET的批处理。它使NH在刷新会话时为update和insert语句创建批处理。它仅适用于Sql Server。(见附件)。但是我说的批量大小是用于查询的,与数据库无关。我的错误是,我删除了我的评论。@Tom:问题是NH有时使用含糊不清的术语。这使得理解这些特性非常困难。是的,这会导致一个陡峭的学习曲线。但是一旦你爬上去,回报是巨大的。@ToM:是的,这是值得努力的,但如果条件更清楚,有时可能会更容易。@ToM:这不是真的。还有另一个批处理大小,可以在配置中设置,并使用ADO.NET的批处理。它使NH在刷新会话时为update和insert语句创建批处理。它仅适用于Sql Server。(见附件)。但是我说的批量大小是用于查询的,与数据库无关。我的错误是,我删除了我的评论。@Tom:问题是NH有时使用含糊不清的术语。这使得理解这些特性非常困难。是的,这会导致一个陡峭的学习曲线。但是一旦你爬上了它,回报是巨大的。@ToM:是的,这是值得努力的,但是如果条件更清楚的话,有时可能会更容易。