2009-10-19 2 views
0

Следующий код демонстрирует ошибочную ситуацию, в которой данные привязаны к базе данных, хотя фиксация никогда не вызывается в транзакции .Операция NHibernate: Почему это приводит к фиксации данных?

Может ли кто-нибудь объяснить, почему?

[TestFixture] 
public class TestFixture 
{ 
     [Test] 
     public void Test() 
     { 
      var config = DoConfiguration(); 

      using(var factory = config.BuildSessionFactory()) 
      { 
       using (var session = factory.OpenSession()) 
       { 
        CallSessionContext.Bind(session); 

        using(new TransactionScope()) 
        { 
         using (session.BeginTransaction()) 
         { 
          var myEntity = session 
           .CreateQuery("from myEntity") 
           .List<MyEntity>()[0]; 

          myEntity.Name = "test name"; 
         } 

         var myEntity2 = session 
          .CreateQuery("from myEntity") 
          .List<MyEntity>()[0]; 

         myEntity2.Name = "test name"; 

         session.Flush(); 
        } 

        CallSessionContext.Unbind(factory); 
       } 
      } 
     } 
} 

ответ

2

Явно вызывающ session.flush() сохраняет ваши изменения. Подробно об этом обсудили post

+0

Привет, спасибо. Поэтому я задаюсь вопросом: есть ли способ запустить две транзакции NHibernate в пределах одного TransactionScope, не убивая TransactionScope между ними? – cbp

+0

Я недостаточно осведомлен, чтобы сказать с уверенностью, но я подозреваю, что вы должны обернуть использование сеанса с помощью области транзакции, а не создавать транзакции nHibernate в сеансе, объявленном за пределами области транзакции. – cmsjr

+0

также, возможно, проверьте это проверьте это http://ayende.com/Blog/archive/2006/06/04/NHibernateAndSystemTransactionsASuccess.aspx – cmsjr

Смежные вопросы