2

EF4と自己参照テーブル(隣接リスト階層の実装)を使用してこの問題に遭遇しました。
注:多対多の参照ではなく、単一のテーブルでの1対多の参照です。EF4の明らかなバグが原因で、失敗を使用して断続的な( " ... ObjectContextが一貫性のない状態になっている可能性があります... ")を

解決しようとします。InvalidOperationExceptionContext.Refresh

前述の投稿で、Shimmyのconnect.microsoft.comリンクをたどると、バグがまだ残っていることがわかりました。
誰かが回避策をお勧めできますか?
データベースとEntityFrameworkが同期しなくなった場合はどうしますか?


役立つかもしれないいくつかのより多くの事実を編集してください:

  1. を取得し、「データベースへの変更は正常にコミットされました...」InvalidOperationExceptionというメッセージが表示された場合、それは正しくありません。彼らはそうではありませんでした。オブジェクトのを1からnull(タイプ)に変更しようとしました。ParentIdParentIdint?
  2. オブジェクトのParentId属性が期待値(null)に正しく変更されました。と呼びますContext.SaveChanges()。次に、例外がスローされます。DBを確認しましたが、値が更新されていません。この場合、ParentIdはデータベース内でまだ1です。
  3. の内部でcatch、を介してオブジェクトを再クエリしようとしても、オブジェクト
    myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
    同じParentIdままです。(誤った)データベース値によって更新されません!
    さて、それは奇妙に思えますが、もう一度保存すると、データベースが修正される可能性があります。
  4. Context.SaveChanges()Stillの内部から後続を呼び出してcatchも、データベースは更新されません。(ただし、今回は例外はスローされません。)
  5. SetParentメソッドを新たに呼び出すと
    myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
    オブジェクトのParentIdパラメータがデータベースの値である1に正しく設定されます。

さらに、笑い声の場合、ParentId親がないことを示すために、オブジェクトのIDをnullではなく独自のIDに設定しました。これは正常に機能し、を引き起こしませんでしたInvalidOperationException。しかし、それは他の理由でPITAです。たとえば、オブジェクトはそれ自体が追加の子であると報告します。

したがって、質問は次のとおりです。

  • 自己参照int? ParentIdをnullに設定しようとすると、例外が発生します。
  • 例外の前にデータベースが更新されないのはなぜですか?
  • そして、なぜ、内部でcatch、再同期できないのですか?!
4

1 に答える 1

1

コンテキストを介してデータベースからオブジェクトを再クエリします。

編集-更新に応じて、コンテキスト内のオブジェクトの変更を送信すると、エラーが発生します。同じコンテキストを使用すると、問題が発生する可能性が高くなります。キャッチ内のコンテキストを再作成して、再クエリと再更新を行い、それがさらにうまく機能するかどうかを確認してください。

于 2011-01-07T15:25:48.603 に答える