【问题标题】:DbContext.ChangeTracker, DbContext.Entry() inconsistenciesDbContext.ChangeTracker、DbContext.Entry() 不一致
【发布时间】:2011-11-17 17:04:16
【问题描述】:

在调试器下,我遇到DbContext.ChangeTracker.Entry(e) 返回一个带有StateDetached 的条目的情况。当我在查找e 时枚举DbContext.ChangeTracker.Entries() 的结果和底层ObjectContext 的条目时,我发现一个带有State 的条目Unchanged(预期)。

发生了什么事?

这里有一些额外的细节:

  • 使用 POCO 实体。
  • 更改跟踪已开启
  • 代理创建已关闭
  • 延迟加载已关闭
  • 第一次保存实体时不会出现问题(例如,添加到上下文中);将旧实体放入上下文然后尝试对其进行更改时发生。这是一个聚合根,其中包含许多不应更改的“参考”实体
  • Equals 在实体上被覆盖,IEquatable<T> 被实现。该代码由 T4 生成。
  • 我正在使用一个通用存储库实现,它以声明方式配置为生成保存规则(例如,是否应添加、附加/修改、附加/未更改实体。它似乎以正确的顺序执行此操作。例如聚合root 是最后添加/附加的,因为首先附加它会使其他实体处于修改状态(首先添加那些未更改的实体可以防止这种情况发生)。

【问题讨论】:

  • 你打电话给DetectChanges了吗?
  • @SLaks - 不。这可能是我必须做的事情吗?
  • 提供更多关于你的情况的细节(你做了什么来得到这种不一致)。还要确保 e 与 ChangeTracker 中的实例相同,并且您没有覆盖实体上的 Equals 方法。
  • @LadislavMrnka - 我会补充细节。我已经解决了这个问题,但我不知道如何,所以值得更新这个问题,因为我不知道根本原因。

标签: entity-framework-4.1 ef-code-first change-tracking


【解决方案1】:

(在问题编辑中回答。转换为社区 wiki 答案。参见Question with no answers, but issue solved in the comments (or extended in chat)

OP 写道:

我已经“解决”了问题,但我仍然想知道发生了什么,因为我的解决方案并没有解决根本原因。我的“解决方案”在更改跟踪器中寻找一个实体(我还通过context.Entry()context.Set().Local 进行了查看——当我使用此代码执行此操作时(我将其作为循环而不是 LINQ 执行,因此我可以设置断点),它的工作原理:

private DbEntityEntry GetChangeTrackedEntry(IEntity mine, Type type)
    {
        foreach (var en in context.ChangeTracker.Entries())
        {
            if (en.Entity.GetType() != type)
                continue;
            if (((IEntity)en.Entity).Id != mine.Id)
                continue;
            return en;
        }

        return null;
    }

当我尝试通过直接使用我的实体来查找实体(通过更改跟踪器、集合等)时,我最终会得到一个分离的案例。

我认为也许有使用 ReferenceEquals 的 EF 案例,但 @Ladislav 的评论可能表明 Equals 的实现有问题。

如果有人有进一步的解释,他们可以将其编辑到这个社区 wiki 答案中。

【讨论】:

    猜你喜欢
    • 2012-09-25
    • 1970-01-01
    • 2013-02-09
    • 2015-09-08
    • 2023-03-15
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多