NHibernate LazyInitializationException .. Как предотвратить? - PullRequest
10 голосов
/ 08 декабря 2010

Я получаю следующую ошибку на нашем производственном веб-сервере:

NHibernate.LazyInitializationException
: 
Initializing[Domain.Entities.AudienceTypes.Region#4]-failed to lazily initialize a 
collection of role: Domain.Entities.AudienceTypes.Region.PeerGroups, 
no session or session was closed

, что не хорошо.Единственный способ заставить приложение работать снова - сбросить IIS, что на самом деле не вариант.Что это значит?Как я могу предотвратить это?

Ответы [ 4 ]

10 голосов
/ 24 апреля 2014

Чтобы избежать этой проблемы, вам нужно изменить ссылку на PeerGroups в вашем классе отображения регионов, как показано ниже

References(x => x.PeerGroupId, "PeerGroupId").Fetch.Join();

Добавление Fetch.Join () предотвратит исключение LazyInitializationException.

9 голосов
/ 08 декабря 2010

Отношения по умолчанию ленивы.Это означает, что SQL-запрос для загрузки отношения выполняется только при доступе к свойству, которое содержит отношение.

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

  • Не закрывайте сеанс, пока вы не закончите
  • Перед закрытием сеанса получите доступ ко всем ленивым свойствам, которые будут использованы позже.*
2 голосов
/ 08 декабря 2010

Не закрывайте сеанс, пока не закончите работу с объектом.

Это одна из самых больших проблем работы с NHIbernate IMHO: определение границ сессии.

В приложении ASP.NET это довольно просто: сеанс начинается в начале запроса, и вы можете закрыть сеанс в конце запроса.

В приложении WinForms это немного сложнее: вам нужно четко определить границы, когда сеанс начинается и когда сеанс закрывается. В приложениях WinForms я обычно определяю «Задачи», которые представляют какую-то единицу работы. Каждое задание имеет сессию. Сессия создается / открывается при создании Задачи и закрывается при ее завершении.

Кроме того, вы также можете определить некоторые ассоциации как не ленивые. Тем не менее, вы должны убедиться, что на производительность это не повлияет.

0 голосов
/ 08 декабря 2010

В дополнение к ответам Фредерика и Люджопа, если вы работаете над приложением ASP.NET (как вы упомянули при упоминании веб-сервера), неплохо было бы использовать инфраструктуру внедрения зависимостей (например, Castle Windor) для обработки жизненный цикл ваших ISessions. У Castle Windsor есть стиль жизни PerWebRequest, который делает это для вас.

В противном случае вручную создайте ISession в начале каждого запроса, который уничтожается (возможно, автоматически очищается) в конце запроса. Тогда ваше приложение может использовать эту ISession.

Это определенно связано с закрытием ISession до того, как вы думаете, что это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...