NHibernate 3和未来与懒惰负载

时间:2011-05-20 12:10:29

标签: c# nhibernate nhibernate-criteria

我有一个实体提醒,其中包含一系列时间表(请参阅映射here)。 我不希望我的集合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正在运行提醒的查询,然后,对于每个提醒,它正在运行单个查询来获取计划。
这是我正在使用的代码:

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.Lazy?为什么我必须使用Future? 如果我在模式中设置了延迟模式,显然,一切都按照我的预期运行。

感谢。

1 个答案:

答案 0 :(得分:2)

您无法使用lazy="false"替换映射中的SetFetchMode

就个人而言,我建议您永远使用lazy="false"。推荐阅读:NHibernate is lazy, just live with it