Microsoft.EntityFrameworkCore执行DbCommand失败的原因排查求助
问题分析与解决方案
根因判断
- 核心问题大概率是Azure SQL的瞬态故障,比如临时网络抖动、数据库节点切换、短暂资源争用等。这类错误并非SQL语句本身存在问题,也不会在Azure SQL的锁或超时日志中留下痕迹,哪怕是毫秒级的短查询也可能触发。
- EF Core默认未开启瞬态故障重试机制,遇到这类临时错误会直接抛出异常,导致日志中出现
Failed executing DbCommand的报错,即便实际耗时远低于超时设置。
NLog规则的疑问解答
- NLog规则里使用
"logger": "*"本身没有问题,它只是捕获所有日志的Error/Fatal级别信息,和SQL执行失败没有直接关联。 final: true的作用是让这条规则处理完日志后不再传递给其他规则,同样不会影响SQL语句的执行结果,只是日志路由的配置,并非报错的原因。
解决建议
- 给EF Core配置瞬态故障重试策略:借助
Microsoft.EntityFrameworkCore.SqlServer包中的EnableRetryOnFailure()方法,在DbContext的配置中开启,示例代码如下:
配置后,遇到Azure SQL的瞬态错误时,EF会自动重试,避免不必要的报错。protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer( yourConnectionString, options => options.EnableRetryOnFailure( maxRetryCount: 5, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null)); } - 当前NLog规则可以保留,但如果存在其他需要处理Error级别日志的规则,需注意
final: true会阻断后续规则的执行,可根据实际需求调整该配置。
内容的提问来源于stack exchange,提问作者Andrew Duffy
相关产品推荐
相关产品推荐

