Исключение NHibernate: транзакция не была связана или была отключена
В нашей среде разработки все приложения ASP.NET работают отлично. Однако, когда я развертываю сайт на тестовой машине, на некоторых страницах я получаю это исключение:
NHibernate.TransactionException: Transaction not connected, or was disconnected
at NHibernate.Transaction.AdoTransaction.CheckNotZombied() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Transaction\AdoTransaction.cs:line 406
at NHibernate.Transaction.AdoTransaction.Rollback() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Transaction\AdoTransaction.cs:line 240
Я не знаю, как решить эту проблему. Единственная разница в версиях БД:
Разработка: 10.0.5500 (2008 R2, SP1, Express)
Тест: 10.0.5500 (2008, SP3)
Есть ли у кого-то идея, что здесь происходит?
Ответы
Ответ 1
Проблема с вашей реализацией шаблона сеанса за запрос. ASP.NET многопоточен, и сеанс закрывается, когда поток завершается, а не когда заканчивается запрос. Есть много примеры о том, как управлять сеансом за запрос, и NHibernate имеет встроенный NHibernate.Context.WebSessionContext, но я предпочитаю использовать инфраструктуру внедрения зависимостей, например Ninject.
Ответ 2
Это был комментарий, но у меня была такая же проблема.
Эта ошибка может возникать, когда триггер вызывает исключение уровня базы данных. Это приведет к откату транзакции и исключению.
Ответ 3
Еще одной проблемой может быть безопасность пользователя (опять-таки исключение уровня базы данных).
В моем случае основная проблема БД была:
The server principal "AppUser" is not able to access the database "AppDB" under the current security context.