.net - 使用事务范围的实体框架回滚
问题描述
我正在尝试创建一种使用实体框架和事务范围将多个更新链接到数据库的方法。我希望能够在验证错误/异常的情况下进行回滚。我的设置是这样的:
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 有自己的处理方式。
解决方案
问题是您没有提交事务,并且您将 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
}
推荐阅读
- ios - 如果有内部动画,UIHostingController 中的 SwiftUI 视图在帧动画期间渲染不正确
- javascript - 反应原生图像裁剪选择器在平面列表上显示(渲染)图像时出现问题
- sql - 过滤不相关的行
- python - 使用 Panda 导入和编写多个 Excel 工作表
- typescript - 这是打字稿错误吗?向对象添加额外属性时出现“不可分配给类型”错误
- rust - 如何使用 LLDB 在 Windows 上调试 *-pc-windows-msvc Rust 程序?
- python - 有人可以帮助我使我的 pyautogui 自动化运行得更快吗?
- javascript - 从数组中的值中获取某个字母
- javascript - 如何使用 Blazor 从 Javascript 中获取 blob
- flutter - Flutter Real Time Database Account' 不是类型 '(dynamic, dynamic) => MapEntry 的子类型
'的'转变'