Я столкнулся с этой проблемой, используя EF4 и самоссылочную таблицу (реализуя иерархию списка смежности).
ПРИМЕЧАНИЕ: не ссылка «многие ко многим», просто «один ко многим» в одной таблице.
Попытки разрешить прерывистый InvalidOperationException
(" ... ObjectContext может находиться в несогласованном состоянии ... ") с использованием Context.Refresh
из-за явной ошибки в EF4.
Из вышеупомянутой ссылки Шимми на connect.microsoft.com я увидел, что ошибка все еще не устранена.
Кто-нибудь может порекомендовать обходной путь?
Что вы делаете, если ваша база данных и Entity Framework не синхронизированы?
EDIT
Еще несколько фактов, которые могут помочь:
- Когда я получаю
InvalidOperationException
и появляется сообщение "Изменения в базе данных были успешно зафиксированы ..." , это не так. Они не были.
Я пытался изменить ParentId
объекта с 1 на ноль (ParentId
типа int?
).
- Атрибут
ParentId
моего объекта правильно изменен на ожидаемое значение (ноль). Я звоню Context.SaveChanges()
. Затем выдается исключение. Я проверяю БД, и значение не было обновлено. В этом случае ParentId
по-прежнему равен 1 в базе данных.
- Внутри
catch
, если я пытаюсь запросить объект через
myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
,
ParentId
объекта остается прежним. Он не обновляется по (неправильному) значению базы данных!
Теперь я думаю, Хорошо, это кажется странным, но, возможно, если я сохраню снова, БД будет исправлена.
- Вызов последующего
Context.SaveChanges()
из catch
по-прежнему не обновляет базу данных. (Но на этот раз исключение не выдается.)
- Если я сделаю новый вызов моего метода SetParent,
myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
,
правильно заполняет параметр ParentId
объекта до 1, значение из базы данных.
Кроме того, для хихиканья я установил для ParentId
объекта свой собственный идентификатор вместо нуля, чтобы обозначить отсутствие родителей. Это работало нормально и не вызывало InvalidOperationException
. Но это PITA по другим причинам. Например, объект сообщает о себе как о дополнительном ребенке.
Итак, вопросы:
- Что означает попытка установить для моей собственной ссылки
int? ParentId
значение null, которое вызывает исключение?
- Почему БД не обновляется до исключения?
- И почему внутри
catch
я не могу выполнить повторную синхронизацию?!