【发布时间】:2025-12-30 11:15:12
【问题描述】:
手头的技术:
- C# .NET 4.0
- SQL Server 2014
- 实体框架 4.3.1
- 代码优先
- ANTS 性能分析器 7
- SQL Server 2014 探查器 2
- 谷歌搜索
问题:
我正在做一些软件的性能工作。有一个特殊的问题会导致严重的减速。使用 EF DataContext 和大约 43 个 ADDED 实体,DataContext.SaveChanges() 方法会占用大量时间。
使用 SQL Profiler 我可以看到插入的持续时间为(大约)0ms。这符合预期。
使用 ANTS Profiler 我可以看到 DataContext.SaveChanges() 占用(大约)1,500 毫秒。深入研究,这段时间的99.9% 在SNINativeMethodWrapper.SNIReadSyncOverAsync 中度过。
使用谷歌,有用的结果很少(没有,因此这个问题)。很长一段时间以来,我第一次发现自己正在查看 Google 结果的第 2 页及更远的地方(未知水域!)。
有几个关于 SO 的问题引用了这种方法,但来自不同的上下文:
- snireadsyncoverasync-performance-issue
- snireadsyncoverasync-and-waitforsingleobject-blocking-ef-performance
我正在寻找不需要以下任何一项的解决方案:
- 将 EF 升级到 V6+(或任何其他版本)
- 远离 CodeFirst
- 不使用 DataContext.SaveChanges()
- 重新架构软件
我应该补充一点,我已禁用以下 EF 设置。这总体上具有积极影响(正如预期的那样),但对问题域没有影响。
Context.Configuration.ValidateOnSaveEnabled = false;Context.Configuration.AutoDetectChangesEnabled = false;
问题:
任何人都可以建议可以解决或避免此问题的代码更改吗?
【问题讨论】:
-
阅读此*.com/questions/5940225/…,然后使用
SqlBulkCopy大量插入记录msdn.microsoft.com/en-us/library/… -
您应该根据有界上下文模式制作不同的上下文。您应该尝试预编译 dbmodel 并存储它们(它们是大上下文的主要减速),然后在创建 DbContext 的过程中使用每个请求的预编译 dbModel。试试看this online course,因为它解释了你遇到的一切。
-
@OgnyanDimitrov 这是您的评论。我将观看这些课程(Plural Sight 说我已经看过两个,但我忘记了什么时候!)。我正在寻找不需要大量重新架构的解决方案。这可能无法避免,但这是我的主要目标。我不确定您的建议如何解决或帮助解决我的问题。添加了 43 个实体的有界上下文可能仍会出现相同的问题。如果我编译模型和查询,我怀疑是一样的。
-
抱歉,我的评论实际上是针对另一个性能问题。
-
为什么要迁移到 6.1?
标签: c# performance entity-framework ef-code-first code-first