2010-11-16 3 views
6

Я не мог найти ответ на этот вопрос, поэтому я предполагаю, что это то, что я делаю неправильно.Fluent NHibernate Проблемы с LazyLoad

У меня есть PersistenceModel установить там, где я поставил конвенции следующим образом: -

persistenceModel.Conventions.Add(DefaultLazy.Always()); 

Однако для одного из HasManyToMany отношений в одном из моих образований я хочу жадную загрузку занять место которой я настройки следующим образом: -

HasManyToMany(x => x.Affiliates).Not.LazyLoad(); 

Наглядно, я ожидаю, жадная загрузка пройдет как я перекрывая ленивый по умолчанию нагрузки, я указанный в качестве конвенции, но она до сих пор ленивые нагрузки. Если я устанавливаю соглашение DefaultLazy никогда и не устанавливаю LazyLoad в отдельных отношениях, он тоже не работает.

Любые идеи?

ответ

9

Когда вы устанавливаете Not.LazyLoad(), вы указываете NHibernate на загрузку Affiliates, когда родитель загружается. NHibernate сделает это, выполнив другой выбор в таблице Affiates many-to-many независимо от того, получаете ли вы доступ к коллекции Affiliates или нет. NHibernate использует другой выбор, потому что это режим выборки по умолчанию. Вы также хотите переопределить режим загрузки, как в запросе, так и в сопоставлении. Для того, чтобы сделать это в отображении, добавьте следующее:

HasManyToMany(x => x.Affiliates) 
    .Not.LazyLoad() 
    .Fetch.Join(); 

Вы также можете включить «.Cascade.AllDeleteOrphan()», если вы хотите NHibernate сохраняться новый Affiliaites добавлены в коллекцию и удалить потерянные из них. Если вы этого не сделаете, вам придется явно вызвать session.Save (newAffiliate). В противном случае вы получите исключение TransientObjectException, когда в вашей коллекции Affiliates будет новый партнер.

+0

Извините, я удалил части кода, которые, как я думал, не имеют отношения к делу. У меня тоже есть .FetchType.Join() и отключение ленивой загрузки все равно не работает. Единственный способ отключить ленивую загрузку Я нашел, что работает для меня, устанавливая соглашение. – Dotnet

+0

Я добавил соглашение DefaultLazy.Always(), и отношение HasManyToMany() корректно загружается при применении Fetch.Join(). Вы можете взять мой образец из GitHub здесь: https://github.com/JamesKovacs/JamesKovacs.StackOverflow/tree/master/FluentNhHacking/ –

+0

Хорошо, я в значительной степени передразнил ваш код в моей ситуации, и он все еще не работает, поэтому мне придется поближе познакомиться. Я использую .ShowSql(), чтобы определить, были ли запросы запущены лениво или нетерпеливо, что я считаю точным? – Dotnet

0

Возможно, это одна глупая вещь, но вы выполняете запрос внутри своей сессии? Скажем,

Using(var session = OpenSession()) 
{ 
    session.Query<Entity>().ToList(); 
} 

Я имел эту проблему раньше, и, наконец, понял, объекты, которые я обратившиеся не было опрошен перед утилизацией сессии.