访问时NHibernate LazyLoad单个属性

访问时NHibernate LazyLoad单个属性,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我有一个实体映射,其中有三个属性标记为延迟加载。我的期望是,当我访问单个属性(即缩略图)时,只加载该属性的数据。但是,如果访问了所有标记为LazyLoaded的属性中的任何一个,NHibernate似乎都会加载这些属性(即,访问缩略图也会加载高分辨率和低分辨率数据) 有没有办法改变这种行为 public sealed class LeakImageMap : ClassMap<LeakImageEntity> { public LeakImageMap() { Laz

我有一个实体映射,其中有三个属性标记为延迟加载。我的期望是,当我访问单个属性(即缩略图)时,只加载该属性的数据。但是,如果访问了所有标记为LazyLoaded的属性中的任何一个,NHibernate似乎都会加载这些属性(即,访问缩略图也会加载高分辨率和低分辨率数据)

有没有办法改变这种行为

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();
  }
}
但是,我只想拥有以下内容:

SELECT
    leakimagee_.Thumbnail as Thumbnail14_
FROM
    Hvcs.LeakImage leakimagee_ 
WHERE
    leakimagee_.Id=@p0;
@p0 = 7588d167-22b5-4f2e-b640-9ecb00ed9138 [Type: Guid (0)]
那么多个惰性属性呢?NHibernate支持他们,但你需要记住一件事。NHibernate将加载实体的所有惰性属性,而不仅仅是立即访问的属性


我猜这是因为hibernate在检索一个lazyload属性时发现,它还可以将其他属性作为副产品(表中的列与感兴趣的列没有区别)它生成的SQL语句,因此它决定了为什么不使用所有这些方便的数据填充这些剩余的属性。(正如我在本例中注意到的,相关字段都映射为“Map”,因此上述推测可能适用,尽管我仍然不确定是否正确)

是的,我的第一反应是它不适用于属性-我不知道这一新功能。我能看出它在哪里有用。也许可以通过映射不同的视图来实现。从表面上看,这似乎是一个非常有用的功能,不幸的是,它的实现是有问题的。为了让事情变得更加有趣,NHibernate在更新期间加载LazyLoad属性,从而导致相当糟糕的性能损失(给定5MB blob)。多个视图可以工作,但我通常尽量避免在可能的情况下。。。NHibernate似乎容易发生“地图”爆炸。
SELECT
    leakimagee_.Thumbnail as Thumbnail14_
FROM
    Hvcs.LeakImage leakimagee_ 
WHERE
    leakimagee_.Id=@p0;
@p0 = 7588d167-22b5-4f2e-b640-9ecb00ed9138 [Type: Guid (0)]