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