Fetch.Join() не работает в Fluent NHibernate

У меня есть следующее переопределение отображения с одной стороны отношения:

public void Override(AutoMapping<ItemAsmtDetailDh> mapping)
{
    mapping.HasMany<WAsmtDetail>(x => x.WAsmtDetails).Inverse().AsBag().Cascade.AllDeleteOrphan().Access.PascalCaseField(Prefix.Underscore).Not.LazyLoad().Fetch.Join();
}

а с другой стороны отношения у меня:

public void Override(AutoMapping<WAsmtDetail> mapping)
{
    mapping.References<ItemAsmtDetailDh>(x => x.ItemAsmtDetailDh).Not.Nullable().Not.LazyLoad().Fetch.Join();
}

Когда я использую параметр ShowSql, я вижу, что он все еще выдаёт отдельные инструкции select для WAsmtDetails, которые дают мне страшную проблему "n + 1 selects". Почему ".Not.LazyLoad(). Fetch.Join()" игнорируется?

Примечание. Я использую версию Fluent NHibernate версии 1.1, не версии 2.1, из-за ошибки в более новой версии. (См. Мой ответ на этот вопрос для подробностей об ошибках.) Я использую NHibernate версии 2.1.2.4000.

Ответ 1

Скорее всего, вы загружаете данные таким образом, чтобы в картировании не было Fetch.Join() (например, HQL или Linq). Из документации NHibernate:

Стратегия выборки, определенная в документе сопоставления, влияет на:

  • поиск через Get() или Load()
  • который происходит неявно при навигации по ассоциации.
  • Запросы ICriteria
  • Запросы HQL, если используется выборка подзапроса