NHibernate 3和Lazy Load的未来

本文关键字:未来 Load Lazy NHibernate | 更新日期: 2023-09-27 17:57:26

我有一个实体Reminder,它包含一个Schedules集合(请参阅此处的映射)。我不希望我的集合Schedules被延迟加载,所以我将属性设置为false:

<set access="field.pascalcase-underscore" cascade="all-delete-orphan" inverse="true" lazy="false" name="Schedules" mutable="true">
      <key foreign-key="FK_Schedules_Reminders">
        <column name="ReminderCode" />
      </key>
      <one-to-many class="ReminderSchedule" />
</set>

在一个查询中,我不想加载集合,所以我将SetFetchMode设置为Lazy:

ICriteria FiltersCriteria = session.CreateCriteria<Domain.Reminder>();
FiltersCriteria.SetFetchMode("Schedules", FetchMode.Lazy);

运行我的查询时,我注意到Nhibernate正在为提醒运行查询,然后,对于每个提醒,它都在运行单个查询来获取Schedules
这是我使用的代码:

ICriteria FiltersCriteria = session.CreateCriteria<Domain.Reminder>();
FiltersCriteria.SetFetchMode("Schedules", FetchMode.Lazy)
Result = FiltersCriteria.List<Domain.Reminder>();

经过一点挣扎,我使用Future更改了代码,一切都很好:

ICriteria FiltersCriteria = session.CreateCriteria<Domain.Reminder>();
FiltersCriteria.SetFetchMode("Schedules", FetchMode.Lazy)
Result = FiltersCriteria
    .Future<Domain.Reminder>()
    .ToList<Domain.Reminder>();

为什么它不能简单地使用FetchMode工作。懒惰?为什么我必须使用Future?如果我在模式中设置懒惰模式,显然,一切都会如我所期望的那样工作。

谢谢。

NHibernate 3和Lazy Load的未来

不能用SetFetchMode覆盖映射中的lazy="false"

就我个人而言,我建议您永远不要使用lazy="false"。推荐阅读:NHibernate很懒,就这样生活吧