2015-03-30 2 views
0

У меня возникли проблемы с попыткой вставить с использованием EF. Вот ситуация:Entity Framework: Ошибка при вставке

  1. Я сделал обычную вставку, когда я создал новый реестр, где PK получил возврат MAX функции из SQL
  2. Затем я удалил эту строку из базы данных без EF
  3. Наконец , я попытался вставить новый реестр с EF, как я сделал на шаге 1

затем я получаю это сообщение из Visual Studio:

Изменения в базе данных были успешно завершены, но при обновлении контекста объекта произошла ошибка. Объект ObjectContext может находиться в несогласованном состоянии. Внутреннее сообщение об исключении: AcceptChanges не может продолжаться, потому что ключевые значения объекта конфликтуют с другим объектом в ObjectStateManager. Перед вызовом AcceptChanges убедитесь, что значения клавиш уникальны.

Чтобы проиллюстрировать мою проблему, я сделал this small video.

Что делать, чтобы решить эту проблему?

+0

Если вы остановите свою программу между шагами 2 и 3 и перезапустите ее, что произойдет? –

+0

В этом случае работает нормально –

+1

Entity Framework сохраняет копию объектов в памяти при их загрузке. Поэтому, если объекты уже загружены и вы удаляете строку в базе данных, в памяти все еще есть копия. Теперь, когда вы пытаетесь вставить объект, EF видит, что уже существует существующий объект с тем же ключом в памяти (хотя он уже удален в db) и выдает ошибку. –

ответ

0

Попробуйте использовать AsNoTracking когда вы первоначально извлекать объекты:

using (var context = new MyContext()) 
{ 
    var myEntities = context.MyEntities.AsNoTracking(); 

    // then you can manually delete a row in the database 
    // and insert it again here in code 

    context.SaveChanges(); 
} 

Таким образом, субъекты не будут кэшируются ObjectContext. Обратите внимание, что это повлияет на области вашего кода, которые зависят от механизма отслеживания, если таковые имеются.

+0

Спасибо за помощь @ OJRaqueño. Я пробовал ваше решение в течение всего дня, с несколькими способами, но ни один из них не работал. Затем я продолжал искать ответы, пока не найду это [ссылка] (https://social.msdn.microsoft.com/Forums/en-US/f57428a8-1430-4e06-be32-70ddc3f27f84/key-clash-when -Добавление-удаление-и-readding-сущность-с-же ключ-почему? форум = adodotnetentityframework). Я начинаю думать, что эта проблема не имеет решения, кроме рефакторирования всей моей базы данных. Но это решение действительно дорого. Есть ли у вас другая идея, что я могу попробовать? –