【问题标题】:Performance Woes with Entity Framework实体框架的性能问题
【发布时间】: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 的问题引用了这种方法,但来自不同的上下文:

我正在寻找不需要以下任何一项的解决方案:

  • 将 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


【解决方案1】:

按照 cmets 的建议:

实际上,对于 dbcontext 中的这几个条目(怀疑不是环境 DbContext),我认为手头的问题实际上不是对数据库的插入/显示更改,而是实际上是数据库调用本身(例如创建一个连接,身份验证),这是造成这种性能损失的主要问题。我实际上可以想象连接池会大大提高性能。

对于感兴趣的人:对于每个“实际”的 Db 调用(即不是查询准备,而是实际将数据提取/写入数据库),如果给出了连接字符串/数据库名称,EF 将首先建立一个连接,或者使用上下文构造函数的 DbContext(Connection, bool contextOwnsConnection=true) 重载中给出的连接。这将发生在每个实际调用数据库的查询中。对于某些数据库,这种连接的建立可能需要相当多的时间,而循环通过上下文实体并根据状态发出 DELETE/UPDATE/INSERT 调用应该花费(至少对于这几个条目)没有那么多时间.

【讨论】: