Я получаю это исключение из Entity Framework 4.3.1 (кстати, из веб-приложения ASP .NET MVC 3, созданного в Visual Studio 2010 против .NET 4):
System.InvalidOperationException: изменения в базе данных были успешно зафиксированы, но при обновлении контекста объекта произошла ошибка. ObjectContext может находиться в несогласованном состоянии. Внутреннее сообщение об исключении: объект не может быть добавлен в контекст объекта. EntityKey объекта имеет ObjectStateEntry, указывающий, что объект уже участвует в другом отношении.
Я немного погуглил и пришел к этому (на msdn):
InvalidOperationException при сохранении
В этом Джефф Дерстадт (принятый ответ) говорит:
Когда вы затем вызываете SaveChanges, контекст сохраняет изменения, а затем пытается исправить записи состояния. Когда он это делает, он выполняет «исправление ключа», при котором временные ключи EntityKey преобразуются в полные ключи EntityKey. В этом случае временный ключ TKP2 теперь будет равен ключу для P2. Контекст пытается «повысить» ключевую запись в диспетчере состояний до полной записи сущности, и в процессе исправляет граф. Вот где возникает исключение из-за конфликта: P1.Spouse = P2, поэтому P2.Spouse должен = P1, но поскольку были добавлены элементы, P2.Spouse уже равен P3, а EntityReference не может иметь более одного значения. К сожалению, этот случай не всегда можно обнаружить до того, как произойдет сохранение базы данных, потому что временные EntityKeys не эквивалентны полным EntityKeys, и поэтому мы не можем идентифицировать будущие коллизии, подобные этому.
Я думаю здесь немного «грязно», поэтому мой вопрос таков...
Поскольку мне все равно, как выглядит граф объектов после сохранения изменений (это конец моего запроса, поэтому он все равно выбрасывается), и данные были вставлены (и на самом деле все в порядке, когда я смотрю на это в SQL Server после того, как я позволю ему продолжить работу в отладчике) - есть ли способ сказать Entity Framework, чтобы он не делал этот шаг (и, следовательно, не получал это исключение и, по-видимому, также экономил немного времени)?