2011-06-04 9 views
3

comment puis-je faire en sorte qu'à chaque requête http je commence une transaction et à la fin je commet mes transactions?Comment ajouter une transaction nhibernate à ninject?

J'utilise déjà InRequestScope pour mes sessions et je l'ai pour mon ninject.

public class NhibernateSessionFactory 
    { 
     public ISessionFactory GetSessionFactory() 
     { 
      ISessionFactory fluentConfiguration = Fluently.Configure() 
                .Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("ConnectionString"))) 
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Map>().Conventions.Add(ForeignKey.EndsWith("Id"))) 
                .ExposeConfiguration(cfg => cfg.SetProperty("adonet.batch_size", "20")) 
                //.ExposeConfiguration(BuidSchema) 
                .BuildSessionFactory(); 

      return fluentConfiguration; 
     } 

     private static void BuidSchema(NHibernate.Cfg.Configuration config) 
     { 
      new NHibernate.Tool.hbm2ddl.SchemaExport(config).Create(false, true); 
     } 
    } 


public class NhibernateSessionFactoryProvider : Provider<ISessionFactory> 
    { 
     protected override ISessionFactory CreateInstance(IContext context) 
     { 
      var sessionFactory = new NhibernateSessionFactory(); 
      return sessionFactory.GetSessionFactory(); 
     } 
    } 

    public class NhibernateModule : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<ISessionFactory>().ToProvider<NhibernateSessionFactoryProvider>().InSingletonScope(); 
      Bind<ISession>().ToMethod(context => context.Kernel.Get<ISessionFactory>().OpenSession()).InRequestScope(); 
     } 

Modifier

que je connais ont ninject mis à OnActivation et OnDeactivation

mais ce que je trouve bizarre est-ce.

-- statement #1 
begin transaction with isolation level: Unspecified 

-- statement #2 
select TOP (1 /* @p0 */) student0_.StudentId   

-- statement #3 
begin transaction with isolation level: Unspecified 

-- statement #4 
select TOP (1 /* @p0 */) student0_.StudentId 

-- statement #5 
select courseperm0_.PermissionId  

-- statement #6 
begin transaction with isolation level: Unspecified 

-- statement #7 
commit transaction 

-- statement #8 
SELECT this_.TaskReminderId as TaskRemi1_13_0_ 

-- statement #9 
SELECT this_.ReminderId    as ReminderId0_2_, 

-- statement #10 
SELECT this_.ReminderId    as ReminderId8_2_, 

Ce qui précède est du profileur mais je débarrassais plus de la requête que je ne pensais pas est relivent au problème.

Regardez comment tout d'un coup pour l'instruction 8,9,10 il ne fait pas de transaction pour. Mais avant cela, il a fait 3. Je ne comprends pas cela.

Edit 2

J'ai trouvé ce post

.OnActivation(session => 
      { 
       session.BeginTransaction(); 
       session.FlushMode = FlushMode.Commit; 
      }) 

Il semble que cela n'aider un peu avec mon problème (ont encore le problème avec le chargement paresseux). Je me demande pourquoi cela fonctionne bien et si quelque chose peut mal tourner en utilisant cela.

Répondre

2

Add activation/actions de deactivaion à votre session de liaison:

.OnActivation(session => session.Transaction.Begin()) 
.OnDeactivation(CommitTransaction) 

public void CommitTransaction(ISession session) 
{ 
    try 
    { 
     session.Transaction.Commit(); 
    } 
    catch(Exception e) 
    { 
     // Add some exception handling (rollback, show error to user, ...) 
     throw; 
    } 
} 
+0

@Remo Gloor - Ok je reçois le premier. En Activation mais je n'obtiens pas la désactivation. Vous avez "CommitTransaction", puis vous avez une méthode appelée BeingTransaction qui semble valider la transaction. Voir étrange comme je l'aurais pensé que ce serait l'EndTransaction. – chobo2

+0

Ma faute devrait être CommitTransaction. Copié le code à tort. –

+0

@ Remo Gloor - Ne devrais-je pas vérifier si la transaction est active en premier? Je suppose que je n'ai pas besoin de fermer la session car ninject devrait s'occuper de ça. – chobo2

Questions connexes