NHibernate.LazyInitializationException - PullRequest
       9

NHibernate.LazyInitializationException

8 голосов
/ 14 июля 2009

У нас периодически возникала эта проблема, но теперь я могу воспроизводить ее каждый раз. Я увеличиваю счетчик просмотров на моих пользовательских форумах, что вызывает ошибку:

NHibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию, ни один сеанс или сеанс не был закрыт

Эта ошибка возникает в другой коллекции объекта. Если я добавлю:

.Not.LazyLoad ()

К моему беглому отображению, ошибка смещается вокруг моего проекта. Я продолжал отключать отложенную загрузку объектов до тех пор, пока она не достигла места, где отсутствовала отложенная загрузка, а затем он выдал эту ошибку:

NHibernate.LazyInitializationException: Не удалось инициализировать прокси - нет сеанса.

Итак, потом я снял затвор на своей ленивой загрузке, и теперь я вернулся к исходной точке. Это только ошибки, когда я увеличиваю этот счетчик просмотров. Вот фрагмент моего кода сохранения базового класса:

using (ISession session = GetSession())
using (ITransaction tx = session.BeginTransaction())
{
       session.SaveOrUpdate(entity);
       tx.Commit();
}

Оглядываясь вокруг, я читал в другом посте, что транзакции могут вызывать проблемы, но это было из-за того, где они были размещены. Этот код распространяется на классы, которые отделены от объектов моего домена (классы репозитория). Вот этот пост:

hibernate: LazyInitializationException: не удалось инициализировать прокси

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

HasManyToMany(x => x.Votes)
    .WithTableName("PostVotes")
    .WithParentKeyColumn("PostId")
    .WithChildKeyColumn("VoteId");

Ответы [ 2 ]

5 голосов
/ 10 ноября 2009

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

1 голос
/ 14 июля 2009

Убедитесь, что в этом сеансе не загружено никаких других объектов. У меня была похожая ситуация, когда я вызывал Save для объекта, который не имел отложенной загрузки, и это действительно отправляло меня в цикл. Почему я получаю эту ошибку на объекте, который не лениво загружается?

В моей ситуации я загружал на страницу несколько других объектов, и эти объекты не были отображены должным образом. Когда я вызвал Save, NHibernate попытался бы синхронизироваться в сеансе и выдать ошибку.

Попробуйте удалить все остальные NHibernate, оставив только это обновление счетчика. Если ошибка не возникает, просто счетчик медленно добавляет обратно в вас другие вызовы, пока ошибка не вернется. Тогда вы можете начать обращаться к настоящему преступнику.

...