访问时NHibernate LazyLoad个人财产

时间:2011-04-20 20:51:23

标签: nhibernate fluent-nhibernate

我有一个实体地图,其中有三个属性标记为Lazy-Loading。我的期望是当我访问单个属性(即缩略图)时,只加载该属性的数据。但是,如果访问其中任何一个属性,NHibernate将加载标记为LazyLoaded的所有属性(即,访问Thumbnail也会加载HighRes和LowRes数据)。

有没有办法改变这种行为?

public sealed class LeakImageMap : ClassMap<LeakImageEntity>
{
  public LeakImageMap()
  {
    LazyLoad();
    Table("LeakImage");
    Id(x => x.Id).GeneratedBy.GuidComb().UnsavedValue(Guid.Empty);

    Map(x => x.FileName).Not.Nullable();
    Map(x => x.FileSize).Not.Nullable();
    Map(x => x.LeakId).Nullable();

    Map(x => x.Thumbnail).Not.Nullable().LazyLoad();
    Map(x => x.HighRes).Not.Nullable().LazyLoad();
    Map(x => x.LowRes).Not.Nullable().LazyLoad();
  }
}

其他信息

访问image.Thumbnail生成以下SQL:

SELECT
    leakimagee_.Thumbnail as Thumbnail14_,
    leakimagee_.HighRes as HighRes14_,
    leakimagee_.LowRes as LowRes14_ 
FROM
    Hvcs.LeakImage leakimagee_ 
WHERE
    leakimagee_.Id=@p0;
@p0 = 7588d167-22b5-4f2e-b640-9ecb00ed9138 [Type: Guid (0)]

但是,只想拥有以下内容:

SELECT
    leakimagee_.Thumbnail as Thumbnail14_
FROM
    Hvcs.LeakImage leakimagee_ 
WHERE
    leakimagee_.Id=@p0;
@p0 = 7588d167-22b5-4f2e-b640-9ecb00ed9138 [Type: Guid (0)]

2 个答案:

答案 0 :(得分:4)

  

多个懒惰属性怎么样? NHibernate支持它们,但你需要记住一件事。 NHibernate将加载所有实体的延迟属性,而不仅仅是立即访问的属性。

来自Lazy Properties

答案 1 :(得分:0)

我想这是因为在检索其中一个lazyload属性时,hibernate发现它还可以将其他产品作为副产品(表中的列与感兴趣的列没有差别)得到它生成的SQL语句,因此它决定了为什么不用所有这些派上用场的数据来填充这些剩余的属性。 (正如我在这种情况下注意到的那样,相关字段都被映射为'Map',因此上述推测可能适用,但仍不确定我是否正确)