Мы столкнулись с этой же ошибкой, и она была вызвана тем, как мы использовали сеансы и транзакции в нашем Web Api с NHibernate.
Мы должны использовать сеанс для запроса. (Это может быть веб-запрос или выполнение обработчика NServiceBus.) Когда запрос запускается, вы должны открыть сеанс и начать транзакцию.
Мы этого не делали. В наших репозиториях мы создали новый сеанс и транзакцию для каждого запроса базы данных. Это означало, что вместо одного сеанса / транзакции для запроса у нас их было много.
Основная причина ошибки для нас заключалась в том, что мы загружали сущность (объект модели домена) за один сеанс, модифицировали ее и сохраняли в другом сеансе. К тому времени, когда NHibernate выполнил вызов обновления, сеанс / транзакция загрузки уже были зафиксированы, очищены и закрыты.
Решением было вытащить наше создание сеанса / транзакции из репозиториев и на уровень контроллера (выполнимо с помощью HttpModule для вызовов REST и / или с аспектно-ориентированным программированием с использованием внедрения зависимостей). Эта одна сессия / транзакция затем живет в течение времени жизни вызова REST или выполнения обработчика NServiceBus и используется для всего доступа к базе данных во время этого вызова. Когда этот вызов заканчивается, он будет зафиксирован или отменен в зависимости от ситуации.
Ответ, приведенный выше при настройке свойства config, просто отключает DTC и возвращает к старому способу выполнения транзакций NHibernate. Это может решить проблему для вас, если вам никогда не придется масштабировать свой Web Api до нескольких экземпляров, но если вы это сделаете, это вызовет у вас проблемы.