NHibernate.LazyInitializationException

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

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

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

.Not.LazyLoad ()

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

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");

person Josh    schedule 14.07.2009    source источник
comment
stackoverflow.com/questions/1117633/ Мой вопрос похож.   -  person Daniel A. White    schedule 16.07.2009


Ответы (2)


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

person Josh    schedule 10.11.2009

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

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

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

person Andrew Hanson    schedule 14.07.2009
comment
Я попробовал ваше предложение, и при попытке перебрать одну из коллекций возникает ошибка в коде страницы. Нет ленивой загрузки, но все равно возникает ошибка. Если я удалю инкремент счетчика, страница будет работать нормально. - person Josh; 14.07.2009