Я начал переключать некоторый уже существующий код nHibernate в проекте ASP.NET на основе Sharepoint с активной загрузки и нового сеанса при каждом обращении к базе данных на ленивую загрузку и сеанс на время HTTP-запроса, и начал сталкиваться с проблемой.
Когда мы создаем элемент в этой системе, существуют отношения «многие к одному», которые заполняются раскрывающимися списками. Это дает нам идентификатор, которого достаточно для сохранения в базе данных.
Чтобы выполнить некоторые задачи после сохранения, такие как уведомление по электронной почте, мы затем загружаем тот же элемент обратно, что ранее приводило к заполнению всего дерева объектов.
Однако после перехода на ленивую загрузку и сеанс со временем жизни всего запроса мы получаем исключения NullReferenceExceptions из свойств ниже Item, которые таинственным образом имеют значение NULL.
Загружаем элемент через nHibernate в changedItem. Вызов, который терпит неудачу:
changedItem.PaperMedia.FormsAnalyst.User.Contact.Name
PaperMedia полностью заполнен, но все в FormsAnalyst имеет значение null, кроме идентификатора.
Это то же состояние, что и при его сохранении, поэтому одной из возможных причин этой проблемы является кэширование и простое извлечение элемента, поэтому nHibernate игнорирует фактические значения из базы данных. Однако я фиксирую транзакцию и явно вызываю Flush () в сеансе между сохранением и последующей загрузкой, поэтому в этом случае ни Commit (), ни Flush () не оказывают никакого влияния на кеш.
Я изменил эти свойства в соответствующих файлах hbm.xml на lazy = "false" и установил SetFetchMode FetchMode.Eager для всех, но безрезультатно.
Я также рассматривал max_fetch_depth как проблему. Если я вызываю Refresh (changedItem) в сеансе, это не имеет никакого эффекта. Однако, если я вызываю Refresh (changedItem.PaperMedia), он заполняется полностью до Name. Казалось бы, это обесценивает max_fetch_depth как проблему, но я тем не менее попытался увеличить его, установив для него значение 6 в hibernate.cfg.xml, а также SetProperty ("max_fetch_depth", "6") в экземпляре конфигурации. при создании фабрики сеансов, и это тоже не повлияло.
Не знаю, что еще попробовать.
Кто-нибудь видел что-нибудь подобное раньше? Я новичок в nHibernate, так что это может быть что-то простое ...
Изменить:
Казалось бы, проблема действительно в кешировании. Вызов Clear () в экземпляре сеанса исправляет это поведение.
Возникает вопрос, почему Flush () не обновляет кешированные элементы? Я думал, что он создан именно для этого.