2011-06-05 23 views
0

我正在使用nhibernate和nhibernate個人資料不斷拋出此警報。如何在事務中包裝延遲加載?

Use of implicit transactions is discouraged"

我實際上是通過ninject

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

     public void CommitTransaction(ISession session) 
     { 

      if (session.Transaction.IsActive) 
      { 
       session.Transaction.Commit(); 
      } 

     } 

     public void StartTransaction(ISession session) 
     { 
      if (!session.Transaction.IsActive) 
      { 
       session.BeginTransaction(); 
      } 
     } 
    } 

包裹在一個事務一切,所以這應該在一個事務中包裹的一切,似乎與任何不懶加載工作。

如果是延遲加載,但我得到的錯誤。我究竟做錯了什麼。

+0

當你說「錯誤」,你的意思是「隱式交易不鼓勵」? – 2011-06-05 20:42:39

+0

@Merlyn Morgan-Graham - 是的,這是我得到的錯誤,因爲由於某種原因,當我通過延遲加載調用它時,它不會將我的語句包裝在事務中。 – chobo2 2011-06-05 20:47:43

+0

此博客帖子(評論部分)似乎告訴我,交易對延遲加載沒有意義 - http://ayende.com/blog/3775/nh-prof-alerts-use-of-implicit-transactions-is -discouraged – 2011-06-06 00:08:09

回答

1

事實上,這仍然是一種隱含的交易,或者相對接近它。注入器對於激活和去激活之間發生的所有事情都是無知的,並且即使狀態不正確或損壞,也會樂於嘗試提交所有的改變。

我看到的是,你基本上試圖欺騙,只是讓Ninject在每個請求開始時自動啓動一個事務,並在每個請求結束時提交事務,希望它會阻止NH抱怨。這是非常糟糕的設計有以下幾個原因:

  1. 您正在迫使即使會議沒有在所有(即開虛假連接)使用的交易。
  2. 沒有異常處理 - 如果操作失敗或回滾,清理代碼會忽略它並嘗試提交。
  3. 如果您嘗試使用TransactionScope,這將造成嚴重破壞,因爲範圍將在NH事務處理完成之前完成。
  4. 當事務實際發生時,您失去了所有控制權,並放棄了在單個請求中(例如)有多個事務的能力。

NH Profiler是完全正確的。這不適合使用NH交易。事實上,如果你懶加載,可能最終交易被提交,而你仍然遍歷結果 - 不是一個好的情況是在

如果你想有一個有用抽象過交易邏輯,並且不希望與ISession對象混淆,然後使用Unit Of Work pattern - 這就是它的設計目的。

否則,請正確地爲您的交易編碼,using子句圍繞實際表示交易的操作。是的,這是額外的工作,但是你不能輕易地以這種方式欺騙你。

+0

工作單元模式如何與存儲庫/服務層模式一起工作? – chobo2 2011-08-16 15:51:11

+0

@ chobo2:它們是互補的。 UOW旨在成爲領域和持久性的無知者。事實上,如果你在網絡上查看有關NHibernate使用存儲庫模式的信息,你可能會看到許多人同時提倡使用UOW。從技術上講,'ISession'應該被認爲是一個工作單元,但是......並不是真的。一個真正的UOW可以保存*所有*你的工作,如果你不這樣做,並丟棄*所有的*;無論如何,會話會保存它,但對於*時*完全不確定。 – Aaronaught 2011-08-16 21:02:06

+0

你有什麼好的教程可以展示所有這些。我一直在尋找,仍然有點困惑,看起來一切都會如何(我需要怎樣的注入,我的服務層中的一個簡單方法如何適用於工作單元,存儲庫是如何工作的?它是否知道關於工作單元的任何信息?) – chobo2 2011-08-18 18:08:40