【问题标题】:NHibernate LazyLoad Individual Property When Accessed访问时 NHibernate LazyLoad 单个属性
【发布时间】:2011-08-26 10:09:12
【问题描述】:

我有一个实体映射,其中三个属性标记为延迟加载。我的期望是,当我访问单个属性(即缩略图)时,只会加载该属性的数据。但是,如果访问这些属性中的任何一个,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)]

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

    多个惰性属性呢? NHibernate 支持它们,但您需要记住一件事。 NHibernate 将加载实体的所有惰性属性,而不仅仅是立即访问的那个。

    来自Lazy Properties

    【讨论】:

    • 是的,我的第一反应是它不适用于属性 - 我不知道这个新功能。我可以看到它在哪里有用。可能可以通过映射不同的视图来实现。
    • 从表面上看,这似乎是一个非常有用的功能,不幸的是,实现是有问题的。为了让事情变得更有趣,NHibernate 在更新期间加载 LazyLoad 属性,从而导致性能下降(假设为 5MB blob)。多个视图会起作用,但我通常会尽可能避免这种情况...... NHibernate 似乎容易出现“地图”爆炸。
    【解决方案2】:

    我猜这是因为在检索延迟加载属性之一时,hibernate 发现它还可以将其他属性作为它生成的 SQL 语句的副产品(表中的列与感兴趣的列没有区别),所以它很好地决定了为什么不使用所有这些派上用场的数据填充这些剩余的属性。 (正如我在这种情况下注意到的,相关字段都被映射为“地图”,因此上述推测可能适用,但仍不确定我是否正确)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 2015-01-04
      • 2021-04-29
      相关资源
      最近更新 更多