Знаете, чтобы реализовать сеанс на веб-запрос в веб-приложении, мы часто создаем сеанс в Application_BeginRequest и закрываем его в глобальных обработчиках событий Application_EndRequest. И затем каждый раз, когда мы получаем доступ к базе данных, мы получаем текущий сеанс с помощью GetCurrentSession вместо того, чтобы открывать новый сеанс с помощью OpenSession.
Так есть ли шанс использовать как сеанс на веб-запрос, так и TransactionScope в веб-приложении? В соответствии с поваренной книгой NHibernate 3.0 (стр. 117) говорится, что вызов TransactionScope.Complete должен происходить после завершения сеанса. Удивительно, но в нем ничего не сказано об этой ситуации, хотя в одной и той же главе обсуждаются как сеанс для каждого веб-запроса, так и использование TransactionScope.
using (var scope = new TransactionScope())
{
using (var session = sessionFactory.OpenSession())
using (var tx = session.BeginTransaction())
{
// do something here
}
scope.Complete();
}