我正在尝试创建一个方法,使用实体框架和事务范围将多个更新链接到数据库。我希望能够在出现验证错误/异常时进行回滚。我的设置如下:
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。当使用常规EF时,这是可行的,但与CRM Dynamics一起使用时,它就不能工作了。CRM Dynamic有自己的处理方法。
发布于 2018-08-14 08:47:44
问题是,您没有提交事务,并且将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
}https://stackoverflow.com/questions/51836451
复制相似问题