gpt4 book ai didi

c# - DbContext.ChangeTracker.HasChanges 非常慢

转载 作者:太空狗 更新时间:2023-10-30 01:04:17 24 4
gpt4 key购买 nike

我的应用程序使用 Entity Framework 6.1.0 和 DbContext API。

它是某种CAD系统,用于编辑一些工程文件。为了检测文档中的更改事实,我使用了 DbContext.ChangeTracker.HasChanges

当文档包含大量数据(大约 20-25 千个实体)时,DbContext.ChangeTracker.HasChanges 运行非常慢。由于此代码用于启用/禁用“保存”命令,因此它在 UI 线程中执行得相当频繁。这反过来又会影响应用程序性能。

我重写了这个片段:

    private Lazy<DbContext> context;

public bool HasChanges
{
get
{
if (!context.IsValueCreated)
{
return false;
}

return context.Value.ChangeTracker.HasChanges();
}
}

这个:

    public bool HasChanges
{
get
{
if (!context.IsValueCreated)
{
return false;
}

var objectStateManager = ((IObjectContextAdapter)context.Value).ObjectContext.ObjectStateManager;

return
objectStateManager.GetObjectStateEntries(EntityState.Added).Any() ||
objectStateManager.GetObjectStateEntries(EntityState.Deleted).Any() ||
objectStateManager.GetObjectStateEntries(EntityState.Modified).Any();
}
}

而且(这是一个奇迹!)一切都运行得非常快。

看起来 DbChangeTracker.HasChanges 实现不是最佳的。我错过了什么吗?

最佳答案

在第一个代码片段中,HasChanges 的调用链涉及对 DetectChanges 的调用。使用快照更改跟踪时,DetectChanges 遍历所有跟踪的实体以确定是否有任何更改,以便 HasChanges 返回正确的结果。

第二个代码片段没有调用 DetectChanges,而是仅向状态管理器询问它已知的状态。因此,如果实体已被修改但尚未检测到,则第二个代码片段可能会返回错误的结果。

有几种方法可以处理这个问题,其中之一是使用更改跟踪代理而不是快照更改跟踪。我写了一个关于 DetectChanges 的博客系列,其中详细描述了各种选项和权衡:http://blog.oneunicorn.com/2012/03/10/secrets-of-detectchanges-part-1-what-does-detectchanges-do/ .我建议通读一遍,以便您可以就哪种更改跟踪最适合您的应用程序做出明智的选择。

关于c# - DbContext.ChangeTracker.HasChanges 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24008584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com