DbContext ChangeTracking杀死性能?

Seb*_*ber 31 performance change-tracking entity-framework-4.1

我正在将应用程序从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是我需要的.我必须能够最终坚持所有更改,而无需手工挑选修改了哪些实体.

我有什么想法可以解决这个性能问题?

Kit*_*Kit 1

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

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