Обходной путь для Entity Framework Context.Refresh ошибка? - PullRequest
2 голосов
/ 07 января 2011

Я столкнулся с этой проблемой, используя EF4 и самоссылочную таблицу (реализуя иерархию списка смежности).
ПРИМЕЧАНИЕ: не ссылка «многие ко многим», просто «один ко многим» в одной таблице.

Попытки разрешить прерывистый InvalidOperationException (" ... ObjectContext может находиться в несогласованном состоянии ... ") с использованием Context.Refresh из-за явной ошибки в EF4.

Из вышеупомянутой ссылки Шимми на connect.microsoft.com я увидел, что ошибка все еще не устранена.
Кто-нибудь может порекомендовать обходной путь?
Что вы делаете, если ваша база данных и Entity Framework не синхронизированы?

EDIT
Еще несколько фактов, которые могут помочь:

  1. Когда я получаю InvalidOperationException и появляется сообщение "Изменения в базе данных были успешно зафиксированы ..." , это не так. Они не были. Я пытался изменить ParentId объекта с 1 на ноль (ParentId типа int?).
  2. Атрибут ParentId моего объекта правильно изменен на ожидаемое значение (ноль). Я звоню Context.SaveChanges(). Затем выдается исключение. Я проверяю БД, и значение не было обновлено. В этом случае ParentId по-прежнему равен 1 в базе данных.
  3. Внутри catch, если я пытаюсь запросить объект через
    myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id),
    ParentId объекта остается прежним. Он не обновляется по (неправильному) значению базы данных!
    Теперь я думаю, Хорошо, это кажется странным, но, возможно, если я сохраню снова, БД будет исправлена.
  4. Вызов последующего Context.SaveChanges() из catch по-прежнему не обновляет базу данных. (Но на этот раз исключение не выдается.)
  5. Если я сделаю новый вызов моего метода SetParent,
    myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id),
    правильно заполняет параметр ParentId объекта до 1, значение из базы данных.

Кроме того, для хихиканья я установил для ParentId объекта свой собственный идентификатор вместо нуля, чтобы обозначить отсутствие родителей. Это работало нормально и не вызывало InvalidOperationException. Но это PITA по другим причинам. Например, объект сообщает о себе как о дополнительном ребенке.

Итак, вопросы:

  • Что означает попытка установить для моей собственной ссылки int? ParentId значение null, которое вызывает исключение?
  • Почему БД не обновляется до исключения?
  • И почему внутри catch я не могу выполнить повторную синхронизацию?!

1 Ответ

1 голос
/ 07 января 2011

Запрос объекта из базы данных через контекст ...

РЕДАКТИРОВАТЬ - в ответ на ваше обновление, если вы отправляете изменения для объекта в контексте, происходит ошибка, при которой, скорее всего, проблема в том же контексте Попробуйте воссоздать контекст в catch для запроса и повторного обновления и посмотрите, будет ли это работать лучше.

...