2009-11-30 71 views
1

如何強制Nhibernate事務失敗(來自調用代碼),以便我可以確保失敗的行爲正常工作?如何強制Nhibernate事務失敗?

我無法修改源代碼,我只是需要讓它失敗!

例如:當你在該行調試立即停止查詢執行之前將開始和關閉數據庫,然後讓代碼運行

public void DoSomething(/*Some parameters*/){ 
using (var tx = _session.BeginTransaction()) 
{ 
    try 
    { 
     //Do something 
     tx.Commit(); 
    } 
    catch (Exception) 
    { 
     if (tx != null) tx.Rollback(); 
      throw; 
    } 
} } 

回答

1

如果有異常發生tx.Commit內(),然後可能插入/更新無效數據的記錄(例如,對於數據庫c來說太長的字符串olumn)。

0

一個想法是。不過,我認爲有一個更好,更具編程性的方式來測試它。

3

拋出異常。

+0

舉例可能嗎? – 2009-11-30 19:53:01

+3

拋出新的Exception(); – epitka 2009-11-30 20:12:35

+0

你是認真的嗎?請閱讀這個問題...... – 2009-12-01 00:09:24

0

設置一些全局變量(我知道人們有全局變量,但這是一個很好的用法)事務內部代碼讀取,如果它看到變量集拋出異常。

2

拋出一個異常:

using(var sess = sf.OpenSession()) 
    using(var tx = sess.BeginTransaction()) 
     throw new Exception(); 

關閉連接:

using(var sess = sf.OpenSession()) 
    using(var tx = sess.BeginTransaction()) 
     sess.Connection.Close(); 

回滾事務:

using(var sess = sf.OpenSession()) 
    using(var tx = sess.BeginTransaction()) 
     tx.Rollback(); 
0

您可以編寫單元測試來驗證代碼的預期行爲。

0

一種方式來做到這一點是:

[Test] 
public void VerifyExceptionIsThrown() 
{ 
    Assert.Throws<NHibernate.HibernateException>(
     () => 
     { 
      using (var tx = _session.BeginTransaction()) 
      { 
       _session.Update(new Entity()); 
       tx.Commit(); 
      } 
     }); 
} 

嘗試更新一個短暫的實體將引發exeption。

或者,如果您使用NHibernateValidator,您可以顯式地失敗您設置的驗證,假設實體的Name屬性不應超過10個字符。 如果使用長度超過10個字符的字符串填充實體的Name屬性,並嘗試保存它,則tx.Commit()會引發異常。