Здесь происходит так много «необычных» вещей, что я едва знаю, с чего начать.
SessionFactory
Фабрика сессий NHibernate обычно инициализируется ОДИН РАЗ при запуске приложения (или когда первыйнеобходимо), а затем этот экземпляр будет жить в течение всей программы и будет использоваться всеми потоками.Обычно мы не ожидаем иметь отдельный экземпляр для потока (как это делает ThreadStatic).Повторная его инициализация приведет к серьезному снижению производительности .
buildSessionFactory () удалит сессию, если она есть, но не получит этот код, если сессия не пуста, поэтому яне понимаю, что на самом деле здесь происходит.
В конце buildSessionFactory (), iSessionFactory.OpenSession () вызывается дважды!Одного должно быть достаточно.
Вы устанавливаете current_session_context_class
в файле конфигурации и вызываете CurrentSessionContext.Bind ().Таким образом, вам не нужно поддерживать свою собственную переменную сеанса потоковой статики.Для этого предназначен CurrentSessionContext.
Сессия должна быть в конечном итоге удалена.Поэтому вызов метода с именем, подобным OpenSession
, подразумевает, что мы получаем новый сеанс, который мы несем ответственность за закрытие.Но ваш собственный OpenSession () может возвращать один и тот же сеанс много раз, что затрудняет понимание того, кто именно отвечает за его закрытие.Лучше назвать его CurrentSession
или аналогичным.
TransactionScopeHelper
Это также невозможно понять.Существует ссылка на переменную session
, но определение и настройка этой переменной не показаны.Код неполный.В некоторых точках ссылка на сеанс устанавливается равной нулю, но попытки ее удаления не предпринимаются, что является обязательным.
Вызов Clear () для сеанса удалит все состояние из сеанса и заставит NHibernate потерять всезагруженные объекты и, следовательно, не смогут выполнять грязную проверку и сохраняться автоматически.Другой код должен был бы помнить, чтобы аккуратно заново все добавить.
Код не показывает, как и когда фактически создаются сеанс, транзакция и область транзакции.Невозможно сказать, правильны ли взаимодействия.Знает ли сессия даже объем транзакции?
Наконец, чтобы ответить на ваш вопрос: «Почему у меня возникает эта проблема?»
Ну, извините, но вся ситуация выглядит так.как беспорядокИ грязный код равен грязным результатам.Если, конечно, проблемы, о которых я упоминал выше, возникают из-за частичного копирования-вставки, в котором пропущены важные части.