1

在调试器下,我有一个DbContext.ChangeTracker.Entry(e)返回带有 a 的条目的State情况Detached。当我在查找 时枚举DbContext.ChangeTracker.Entries()底层证券的结果和条目时,我找到了一个带有(预期)的条目。ObjectContexteStateUnchanged

到底是怎么回事?

以下是一些额外的细节:

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

1 回答 1

0

(在问题编辑中回答。转换为社区 wiki 答案。请参阅没有答案的问题,但问题在评论中解决(或在聊天中扩展)

OP写道:

我已经“解决”了这个问题,但我仍然想知道发生了什么,因为我的解决方案并没有解决根本原因。我的“解决方案”在更改跟踪器中寻找一个实体(我也通过context.Entry()and查看了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;
    }

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

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

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

于 2015-02-03T16:21:02.040 回答