2011-06-04 23 views
3

我該如何讓每一個http請求都能這樣我開始一個事務,並在最後提交我的事務?如何將nhibernate事務添加到ninject?

我已經在使用InRequestScope進行會話,併爲我的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(); 
     } 

編輯

我知道有ninject設置爲OnActivation和OnDeactivation

但什麼我發現奇怪的是這樣的。

-- 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_, 

以上是來自探查器,但我剝去了大部分查詢,因爲我不認爲是重溫問題。

看看如何突然發表聲明8,9,10它沒有進行交易。但在此之前,它提出了3.我不明白這一點。

編輯2

我發現這個post

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

看來這確實有點幫助與我的問題(仍然有延遲加載的問題)。我想知道爲什麼這可以工作,如果有什麼可以通過使用這個錯誤。

回答

2

添加激活/ deactivaion行動,您的會話綁定:

.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 - 好吧,我得到的第一個。在激活但我沒有得到停用。你有「CommitTransaction」,然後你有一個稱爲BeingTransaction的方法,似乎提交了交易。看到奇怪,因爲我會認爲這將是EndTransaction。 – chobo2 2011-06-04 19:23:24

+0

我的錯應該是CommitTransaction。錯誤地複製了代碼。 – 2011-06-05 12:04:03

+0

@ Remo Gloor - 我不應該先檢查交易是否有效嗎?我想我不需要關閉會議,因爲ninject應該注意這一點。 – chobo2 2011-06-05 20:08:29

相關問題