Свободные NHibernate LazyLoad Проблемы - PullRequest
6 голосов
/ 16 ноября 2010

Я не смог найти ответ на этот вопрос, поэтому я предполагаю, что я что-то не так делаю.

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

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

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

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

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

Есть идеи?

Ответы [ 2 ]

9 голосов
/ 16 ноября 2010

Когда вы устанавливаете Not.LazyLoad (), вы указываете NHibernate загружать Affiliates при загрузке родительского элемента.NHibernate сделает это, выполнив другой выбор в таблице Affliates «многие ко многим», независимо от того, имеете ли вы доступ к коллекции Affiliates или нет.NHibernate использует другой выбор, потому что это режим выборки по умолчанию.Вы также хотите изменить режим выборки, либо в запросе, либо в отображении.Чтобы сделать это в сопоставлении, добавьте следующее:

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

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

0 голосов
/ 24 декабря 2012

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

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

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

...