【问题标题】:EF Core doesn't throw exceptions on SaveChanges()/SaveChangesAsync()EF Core 不会在 SaveChanges()/SaveChangesAsync() 上引发异常
【发布时间】:2021-08-09 20:15:37
【问题描述】:

我有一个解决方案,其中包含数据层信息(所有模型和 dbContext)的项目被 Windows 服务项目和 ASP.NET MVC 应用程序引用,因为它们使用相同的数据结构。

最近在使用 Windows 服务时,我注意到调试器中的内存使用量很大,当约束出现问题但没有引发错误时。当我对其进行故障排除时,我意识到方法SaveChanges()SaveChangesAsync() 永远不会抛出任何类型的异常,因此我无法在try/catch 块中捕获异常。我可以在输出窗口中看到错误“执行 DbCommand 失败...”,但程序会继续在 DbContext 中运行一些循环,并且内存使用量将以每秒 500MB 的速度增加,并且会上升到最大可用而不会使应用程序崩溃。

我设法在使用不存在的 FK 创建新位置条目时记录跟踪日志,并且似乎在 dbContext 中发生错误后,EF 为 DbContext 中定义的每个 DBSet 启动“选择”查询,并开始从选择查询中跟踪每个实体结果。您可以在下面看到登录图片的那部分...

我尝试使用 EF Core 创建新的 ASP.NET MVC 项目,但无法在干净的项目中重现此问题,因此此问题可能存在于配置或类似问题中。

整个解决方案最初是在 .NET Framework 4.5 上开始的,后来被转换(重写)为 .NET Core 3.1,最后更新到 .NET 5。在 .NET Core 3.1 版本的 MVC 项目中,数据层被提取到单独的项目中需要windows服务。我已将每个包更新到最新版本,我尝试了 DbContext 和日志记录解决方案的不同配置选项,但没有任何改变。我可以通过手动为任何模型上的约束设置错误 ID 来重现此问题,因此它与特定模型或验证无关。不幸的是,我无法确定这种行为成为解决方案的确切时间......

有谁知道导致这种行为的原因或从哪里开始排除故障?

【问题讨论】:

  • 您是如何发现异常的? catch(Exception)catchcatch(DbUpdateException) ?您使用的是什么数据库服务器?您应该能够将此问题简化为具有 2 个实体类(带有 FK)的简单程序,但我想这将始终有效。
  • @Neil 谢谢回复。我正在使用 MS SQL。我正在捕获所有异常,例如catch(Exception ex),然后检查特定异常,如果我期待 DbUpdateException 之类的东西,但程序永远不会 Catch 部分,它一直在 SaveChanges() 上运行,这就是我在调试中放松的地方
  • 你在使用 Serilog 吗?
  • 我很想从数据库中重新创建实体类和上下文(使用数据库优先向导),然后根据您拥有的代码检查差异。我怀疑您的模型没有缺少父/子关系。
  • @ErikEJ 是的,我使用 serilog withs sinks 作为文件和 GrayLog

标签: c# asp.net-core exception memory entity-framework-core


【解决方案1】:

与 EF Core 一起使用时,Serilog.Exceptions 是一个众所周知的问题,请参阅此处的详细文档:https://github.com/RehanSaeed/Serilog.Exceptions#serilogexceptionsentityframeworkcore

【讨论】:

  • 非常感谢。这完全解决了我的问题。
猜你喜欢
  • 2019-12-10
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
相关资源
最近更新 更多