2009-10-19 5 views
0

Le code suivant illustre une situation trompeuse dans laquelle les données sont validées dans la base de données, même si la validation n'est jamais appelée sur une transaction .Transaction NHibernate: Pourquoi cela entraîne-t-il des données validées?

Quelqu'un pourrait-il expliquer pourquoi?

[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); 
       } 
      } 
     } 
} 

Répondre

2

Appel explicite session.flush() persiste vos modifications. Discuté en détail dans ce post

+0

Salut merci, donc je suppose que la question est - Y at-il un moyen d'exécuter deux transactions NHibernate dans le même TransactionScope, sans tuer le TransactionScope entre? – cbp

+0

Je ne suis pas assez familier pour dire avec confiance, mais je suppose que vous devriez envelopper votre utilisation de session avec la portée de la transaction, plutôt que de créer des transactions nHibernate sur une session déclarée en dehors de la portée de la transaction. – cmsjr

+0

également, peut-être vérifier cela vérifier cela http://ayende.com/Blog/archive/2006/06/04/NHibernateAndSystemTransactionsASuccess.aspx – cmsjr

Questions connexes