我正在使用以下代码来执行使用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