(Ответ на вопрос редактируется. Преобразован в вики-ответ сообщества. См. Вопрос без ответов, но проблема решена в комментариях (или расширена в чате) )
ОП написал:
Я «решил» проблему, но я все еще хочу знать, что происходит, потому что мое решение ничего не делает для устранения основной причины. Мое "решение" ищет сущность в трекере изменений (я также просматривал через 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
.
Если у кого-то есть дополнительное объяснение, он может отредактировать его в ответе этого вики-сообщества.