我正在尝试创建一种使用实体框架和事务范围将多个更新链接到数据库的方法。我希望能够在验证错误/异常的情况下进行回滚。我的设置是这样的:
using (TransactionScope scope = new TransactionScope())
{
try{
SomeBusinessLogic();
RepoMethod1();
Throw random Exception here;
RepoMethod2();
catch(Exception ex){
Transaction.Current.Rollback();
scope.Dispose();
return;
}
}
public RepoMethod1(){
using (MyContext context = new MyContext())
{
DoSomeWork();
context.SaveChanges();
}
}
不幸的是,如果引发异常,则不会发生回滚。 但是应该吗?!
修改
所以看来我的问题出在我通过实体框架使用CRM Dynamics的过程。与常规EF一起使用时,此方法有效,但与CRM Dynamics一起使用时,它将根本不起作用。 CRM Dynamics有自己的处理事物的方式。
答案 0 :(得分:1)
问题是您不提交事务,并且将TransactionScope实例与当前环境事务混合在一起。此外,您不必手动回滚失败的事务,这将由事务管理器在提交失败的情况下完成。以下代码可以完成这项工作:
SomeBusinessLogic() // do this outside of the transaction because it's not part of it
try
{
using (TransactionScope scope = new TransactionScope())
{
RepoMethod1();
RepoMethod2();
scope.Complete(); // commits the transaction
} // end of using calls scope.Dispose()
}
catch (TransactionAbortedException ex)
{
// handle exception
}