EF Core 2.1实现父子依赖事务遇TransactionScope报错,求解决方案
解决EF Core 2.1中父事务包含子事务的问题
嘿,我来帮你搞定这个事务嵌套的问题!首先得说清楚你遇到错误的核心原因:EF Core 2.1并不支持TransactionScope这种环境事务,所以系统抛出了那个警告(还被当成错误处理了)。不过别担心,咱们用EF Core原生的事务API就能轻松实现你要的「任一子事务失败,父事务回滚」的需求。
推荐方案:使用EF Core原生事务API
因为你的DbContext是在控制器构造函数中初始化的,同一个请求里它是单实例存在的——也就是说父方法开启事务后,子方法复用同一个DbContext的所有数据库操作,都会自动加入到这个事务里。具体修改步骤如下:
- 父方法中开启EF Core事务,持有事务对象
- 调用子方法执行数据库操作
- 所有操作成功则提交事务,任一环节出错则触发回滚
修改后的代码示例:
public bool Father() { using (var transaction = _dbcontext.Database.BeginTransaction()) { try { // 父方法中的数据库操作 var x1 = _dbcontext.Table1.FirstOrDefault(); // ...其他业务操作 // 调用子方法,复用同一个DbContext,自动加入当前事务 var childSuccess = Child(); if (!childSuccess) { // 子方法业务逻辑失败,手动回滚事务 transaction.Rollback(); return false; } // 所有操作验证通过,提交事务 transaction.Commit(); // 后续非数据库业务操作 return true; } catch (Exception ex) { // 捕获到异常,回滚事务 transaction.Rollback(); // 这里可以添加异常日志、通知等处理逻辑 return false; } } } public bool Child() { try { // 子方法中的数据库操作,自动继承父方法的事务 var x2 = _dbcontext.Table2.FirstOrDefault(); // ...其他业务操作 // 如果子方法有自定义业务判断失败,返回false触发父事务回滚 return true; } catch (Exception ex) { // 子方法执行异常,返回false return false; } }
备选方案:抑制TransactionScope警告(不推荐)
如果你坚持要使用TransactionScope,可以通过配置抑制那个警告,但必须注意:EF Core 2.1对TransactionScope的支持非常有限,可能会出现不可预期的问题。配置方式如下:
在你的DbContext的OnConfiguring方法中添加警告忽略逻辑:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder .UseSqlServer("你的数据库连接字符串") .ConfigureWarnings(warnings => warnings.Ignore(Microsoft.EntityFrameworkCore.Diagnostics.CoreEventId.AmbientTransactionWarning)); }
不过还是强烈推荐第一种原生事务方案,它更贴合EF Core的设计理念,运行起来也更稳定可靠。
内容的提问来源于stack exchange,提问作者Santa Cloud
相关产品推荐
相关产品推荐

