DbContext ChangeTracking杀死性能?

时间:2011-05-12 07:01:00

标签: performance entity-framework-4.1 change-tracking

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

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

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

关闭AutoDetectChanges,LazyLoading和ProxyGeneration让我赢了2-3秒。

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

这表明ChangeTracking是罪魁祸首。

但ChangeTracking是我需要的。我必须能够最终坚持所有更改,而无需亲自挑选哪些实体被修改。

我是如何解决这个性能问题的?

2 个答案:

答案 0 :(得分:1)

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

我正在使用通用存储库模式,因为我不想跟踪每个案例的更改或实施特定策略。如果这还不够,可能会在上下文之外滚动您自己的更改跟踪,并根据需要添加实体。

答案 1 :(得分:0)

没有看到查询,我无法确定问题可能是什么。这可能是相关的吗?

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

根据所使用的LINQ运算符,看起来EF很难将一些查询转换为SQL。也许你正在遇到类似情况。