多列上的Nhibernate Lazy加载

时间:2011-11-24 14:02:37

标签: c# performance nhibernate fluent-nhibernate lazy-loading

如果我使用NHiberante在多个属性列上设置LazyLoad并依次访问这些属性,它是否会在数据库中查询每个属性?
例如:

public class Product
{
    public virtual int ID {get; set;}
    public virtual string Name {get; set;}
    public virtual string FullName {get; set;}
    public virtual float Price {get; set;}
}

public class ProductMap : ClassMap<Product>
{
    Id(p => p.ID);
    Map(p => p.Name).Not.LazyLoad();
    Map(p => p.FullName).LazyLoad(); // Redundant - I know...
    Map(p => p.Price).LazyLoad();    // Redundant - I know...
}

如果我像这样查询数据库:

var product = session.Load<Prodct>(2);
if (product.FullName == "*" && product.Price = 111)

是否会有3个查询

  1. 产品实体
  2. FullName属性
  3. 价格属性
  4. 或当NHibernate在DB中查询FullName时,它会查询该行的所有列吗?

2 个答案:

答案 0 :(得分:2)

NHibernate将在单个查询中加载实体的所有惰性属性(您可以自己尝试......)

此功能的主要用例是blob。

另一方面,

Lazy references 会根据需要加载。

作为旁注,session.Load不查询数据库;它只是创建一个代理,它将被懒惰地加载。使用session.Get

答案 1 :(得分:2)

将有2个查询

  1. 产品实体
  2. 所有LazyLoaded属性