31

我正在将应用程序从 EF1 升级到 EF4.1 我使用“ADO.NET DbContext Generator”模板创建了一个 DbContext 和一组 POCO。

当我查询生成的 DbContext 时,查询的数据库部分需要 4ms 才能执行(使用 EF Profiler 验证)。然后在将结果返回给应用程序之前,上下文需要大约 40 秒(用词:四十!)来完成它所做的任何事情。

EF1 在不到 2 秒的时间内处理相同的查询。

关闭 AutoDetectChanges、LazyLoading 和 ProxyGeneration 可以让我赢得 2-3 秒。

当我使用 AsNoTracking() 扩展方法时,我能够将总执行时间减少到大约 3 秒。

这表明 ChangeTracking 是罪魁祸首。

但是ChangeTracking是我需要的。我必须能够最终保留所有更改,而不必手动选择修改了哪些实体。

有什么想法可以解决该性能问题吗?

4

2 回答 2

1

本文档末尾的技术有用吗?或者,我已经避免了许多性能缺陷,使用流畅的接口以声明方式声明给定事务中的哪些实体肯定不会改变或可能改变(不可变与不可变)。例如,如果我保存的实体是聚合根,其中根或其实体引用“refdata”项,那么这种启发式方法会阻止许多写入,因为不需要跟踪不可变项。可变项目都是在没有检查的情况下编写的(一个弱点......可能会或可能不会接受)。

我将它与通用存储库模式一起使用正是因为我不想跟踪更改或为每种情况实施特定策略。如果这还不够,也许在上下文之外滚动您自己的更改跟踪并根据需要添加实体将起作用。

于 2011-09-09T01:21:22.700 回答
0

Without seeing the query, I can't say for sure what the problem might be. Could this be related?

Why does the Contains() operator degrade Entity Framework's performance so dramatically?

Depending on the LINQ operators being used, it appears that EF has a tough time converting some queries to SQL. Maybe you're running up against a similar situation here.

于 2011-11-09T18:33:08.450 回答