实体框架核心错误? SaveChanges 抛出选择

Posted

技术标签:

【中文标题】实体框架核心错误? SaveChanges 抛出选择【英文标题】:Entity Framework Core bug? SaveChanges throw select 【发布时间】:2021-11-15 07:12:45 【问题描述】:

我正在使用 Entity Framework Core 和 .NET 5,我检测到服务器中的一些内存增加流。当我看到控制台日志时,我看到了问题,当SaveChanges 调用失败时,它会抛出所有表和所有记录的选择:(

我的数据库很大,内存满了。我一直在搜索互联网,但找不到任何类似的错误。

我希望有人有解决方案。谢谢

日志:

[10:59:45 WRN] 编译一个查询,该查询通过“包含”或通过投影为多个集合导航加载相关集合,但未配置“QuerySplittingBehavior”。默认情况下,实体框架将使用“QuerySplittingBehavior.SingleQuery”,这可能会导致查询性能下降。请参阅https://go.microsoft.com/fwlink/?linkid=2134277 了解更多信息。要识别触发此警告的查询,请调用“ConfigureWarnings(w => w.Throw(RelationalEventId.MultipleCollectionIncludeWarning))”

[10:59:46 DBG] 生成的查询执行表达式: 'queryContext => 新 SingleQueryingEnumerable( (关系查询上下文)查询上下文, RelationalCommandCache.SelectExpression( 投影映射: 选择 t.Id, t.AceptaTerminosYCondiciones, t.Activo, t.ContactoPrincipalId, t.CreatedBy, t.CurrentTimestamp, t.DateCreated, t.DateEdited, t.EditedBy, t.EstadoId, t.PersonaHumanaId, t.PersonaJuridicaId, t .TipoPersonaId, t.TipoSujetoObligadoId, t.UsuarioId, p.Id, p.CreatedBy, p.Cuit, p.CurrentTimestamp, p.DateCreated, p.DateEdited, p.EditedBy, p.FechaConstitucion, p.Jurisdiccion, p.NroInscripcion , p.RazonSocial, ....

【问题讨论】:

我们是否应该调查 SaveChanges 失败的原因? SaveChanges 在失败后通常不会运行选择。此选择可能在失败前由 SaveChanges 触发,以获取生成插入/更新查询所需的一些缺失信息 如果没有看到类模型和映射以及生成的查询,我们无法回答这个问题。 问题是它失败时生成的选择给我带来了几千兆字节的记录。有没有办法禁用它? 当我的代码对所有表抛出 DbUpdateException Ef 生成查询并且我的内存流量增加很多时。但是,如果查询不抛出错误,则此选择不会执行。我尝试进行拦截,但之前执行了选择。 【参考方案1】:

就我而言,我将其追溯到 Sherilog 的 ExceptionDetails 接收器。

Serilog.Exceptions 正在序列化 DbUpdateException,这可能会导致尝试遍历与异常关联的整个对象图。如果您从 Serilog 配置中删除 .Enrich.WithExceptionDetails() ,那么一切都会按预期进行。

详情请看这里https://github.com/dotnet/efcore/issues/15214

【讨论】:

以上是关于实体框架核心错误? SaveChanges 抛出选择的主要内容,如果未能解决你的问题,请参考以下文章

在 SaveChanges 的实体框架中出现错误

ObjectContext.SaveChanges()失败,SQL CE

实体框架6 - SQL Server和Oracle(SaveChanges)

实体框架 - SaveChanges 与事务

实体框架 SaveChanges 不保存数据

实体框架性能问题,saveChanges 很慢