在调试器下,我遇到DbContext.ChangeTracker.Entry(e)
返回State
Detached
条目的情况。当我在查找DbContext.ChangeTracker.Entries()
时枚举ObjectContext
的结果和基础e
的条目时,我会找到State
Unchanged
的条目(预期)。
发生了什么事?
以下是一些其他细节:
Equals
,并实现了IEquatable<T>
。该代码由T4生成。答案 0 :(得分:0)
(在问题编辑中回答。转换为社区维基回答。请参阅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;
}
当我尝试通过直接使用我的实体来查找实体(通过更改跟踪器,集合等)时,那就是我最终得到一个分离的案例。
我想也许EF使用
ReferenceEquals
的情况,但@ Ladislav的评论可能表明Equals
实施有问题。
如果有人有进一步的解释,他们可以将其编辑到此社区wiki答案中。