NHibernate 3 и будущее с ленивой нагрузкой - PullRequest
2 голосов
/ 20 мая 2011

У меня есть напоминание о сущности, которое содержит коллекцию расписаний (см. Отображение здесь ).Я не хотел, чтобы моя коллекция загружалась с отложенной загрузкой, поэтому я установил для атрибута значение 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.Ленивый?Почему я должен использовать будущее?Если я установлю ленивый режим в своей схеме, очевидно, все будет работать так, как я ожидал.

Спасибо.

1 Ответ

2 голосов
/ 21 мая 2011

Вы не можете переопределить lazy="false" в отображении с помощью SetFetchMode.

Лично я рекомендую вам никогда использовать lazy="false". Рекомендуем прочитать: NHibernate ленив, просто смирись с этим

...