EF4と自己参照テーブル(隣接リスト階層の実装)を使用してこの問題に遭遇しました。
注:多対多の参照ではなく、単一のテーブルでの1対多の参照です。EF4の明らかなバグが原因で、失敗を使用して断続的な( " ... ObjectContextが一貫性のない状態になっている可能性があります... ")を
解決しようとします。InvalidOperationException
Context.Refresh
前述の投稿で、Shimmyのconnect.microsoft.comリンクをたどると、バグがまだ残っていることがわかりました。
誰かが回避策をお勧めできますか?
データベースとEntityFrameworkが同期しなくなった場合はどうしますか?
役立つかもしれないいくつかのより多くの事実を編集してください:
- を取得し、「データベースへの変更は正常にコミットされました...」
InvalidOperationException
というメッセージが表示された場合、それは正しくありません。彼らはそうではありませんでした。オブジェクトのを1からnull(タイプ)に変更しようとしました。ParentId
ParentId
int?
- オブジェクトの
ParentId
属性が期待値(null)に正しく変更されました。と呼びますContext.SaveChanges()
。次に、例外がスローされます。DBを確認しましたが、値が更新されていません。この場合、ParentId
はデータベース内でまだ1です。 - の内部で
catch
、を介してオブジェクトを再クエリしようとしても、オブジェクト
myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
は
同じParentId
ままです。(誤った)データベース値によって更新されません!
さて、それは奇妙に思えますが、もう一度保存すると、データベースが修正される可能性があります。 Context.SaveChanges()
Stillの内部から後続を呼び出してcatch
も、データベースは更新されません。(ただし、今回は例外はスローされません。)- SetParentメソッドを新たに呼び出すと
myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
、
オブジェクトのParentId
パラメータがデータベースの値である1に正しく設定されます。
さらに、笑い声の場合、ParentId
親がないことを示すために、オブジェクトのIDをnullではなく独自のIDに設定しました。これは正常に機能し、を引き起こしませんでしたInvalidOperationException
。しかし、それは他の理由でPITAです。たとえば、オブジェクトはそれ自体が追加の子であると報告します。
したがって、質問は次のとおりです。
- 自己参照
int? ParentId
をnullに設定しようとすると、例外が発生します。 - 例外の前にデータベースが更新されないのはなぜですか?
- そして、なぜ、内部で
catch
、再同期できないのですか?!