Performance DbContext变更跟踪会降低性能吗?

Performance DbContext变更跟踪会降低性能吗?,performance,entity-framework-4.1,change-tracking,Performance,Entity Framework 4.1,Change Tracking,我正在将一个应用程序从EF1升级到EF4.1 我使用“ADO.NET DbContext生成器”模板创建了一个DbContext和一组POCO 当我查询生成的DbContext时,查询的数据库部分需要4ms才能执行(使用EF Profiler验证)。然后,在将结果返回给应用程序之前,上下文执行任何操作都需要大约40秒(换句话说:40!) EF1在不到2秒内处理相同的查询 关闭AutoDetectChanges、LazyLoading和ProxyGeneration可以为我赢得2-3秒 当我使用A

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

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

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

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

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

这表明变更跟踪是罪魁祸首

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


有什么办法可以解决这个性能问题吗?

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


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

如果没有看到查询,我无法确定问题可能是什么。这有关系吗


根据使用的LINQ运算符,EF似乎很难将某些查询转换为SQL。也许你在这里遇到了类似的情况。

这里已经讨论过好几次了。它看起来像是EFv4.1中的一个bug。当我使用EF4.0和“ADO.NET POCO实体生成器”模板时,情况更糟。然后需要80多秒,直到我得到一些结果。因此,该漏洞在早期版本中更为严重,MS无法在EF4.1中正确修复它?您可以尝试关闭
自动检测更改
/使用
作为跟踪
,但同时创建跟踪代理(所有属性必须是虚拟的)。我不知道这首歌是否会改变,我现在无法亲自测试。我看到你们也在MSDN论坛上问过这个问题。添加在POCOs中使用EFv4时性能不佳的详细信息。@程序员的导航属性有问题,请尝试使用ProxyGeneration=true:不要实例化和分配任何集合。代理生成将处理这个问题。但是,要获取代理对象,需要使用DbSet.create创建它。仅仅用“new”实例化是不够的。