我正在使用以下代碼來執行使用Castle ActiveRecord v1.0.3(eugh,legacy!)的刪除操作。使用OnTransactionCompleted事件確定ActiveRecord.TransactionScope是否成功
public void Delete(anObject instance)
{
try
{
using (var scope = new ActiveRecord.TransactionScope(TransactionMode.Inherits, OnDispose.Rollback))
{
...(DB Operations)
scope.VoteCommit();
MethodCallBecauseOfSuccess();
}
}
catch (NHibernate.TransactionException ex)
{
MethodCallBecauseOfFailure();
}
}
的問題是,因爲TransactionMode.Inherits的,這種方法的消費者被允許包裹調用此方法在自己的ActiveRecord.TransactionScope。在他們這樣做的情況下,異常不會發生在scope.VoteCommit(),因此不正確地調用MethodCallBecauseOfSuccess()。
這是我正在使用的遺留代碼,所以我不能在此時重新使用消費代碼,我只能更改此方法。
所以我現在在看TransactionScope.OnTransactionCompleted事件,因此,如果交易範圍消失成一個調用的方法,我還可以當它完成的陷阱,並調用適當的方法,如:
public void Delete(anObject instance)
{
try
{
using (var scope = new TransactionScope(TransactionMode.Inherits, OnDispose.Rollback))
{
scope.OnTransactionCompleted += (sender, args) =>
{
//if FAIL
MethodCallBecauseOfFailure();
//else SUCCEED
MethodCallBecauseOfSuccess();
};
...(DB Operations)
scope.VoteCommit();
}
}
catch (NHibernate.TransactionException ex)
{
...
}
}
不幸的是,我似乎無法確定TransactionScope是失敗還是成功。匿名方法的參數是sender = Parent(我認爲!)事務範圍,args =空。當然,我可以訪問當前的TransactionScope。有幾個屬性可供檢查。
有什麼方法可以確定它是失敗還是成功?
不,不幸的是沒有;它總是看起來是'假'。我試過在SessionScope中包裝所有東西,但它仍然是錯誤的。 – OffHeGoes 2012-08-15 08:10:25