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, если используется выборка подзапроса