1

大学のプロジェクトとして .net アプリケーションを作成していますが、自己追跡エンティティ セットに問題があります。レコードを選択し、wcf サービスを介して渡し、いくつかの変更を加えて、サーバーに再度渡します。何が変更されたかを比較したいので、コンテキストから同じレコードをもう一度選択して (これは古い値を持つレコードです)、比較します。次に、サービスを介して渡されたエンティティとコンテキストで ApplyChanges を呼び出したいと比較した後、エラーが発生しました。

オブジェクトのキー値が ObjectStateManager 内の別のオブジェクトと競合するため、AcceptChanges を続行できません。AcceptChanges を呼び出す前に、キー値が一意であることを確認してください。

同じエンティティを2回ロードしたためだと思います(変更前と変更後)。変更を比較するより良い方法はありますか (別の db テーブルで変更履歴を作成する必要があります)? また、2 つのクライアントが同じレコードを取得し、最初のクライアントがそれを変更して db に保存したい場合にも、このエラーが発生しませんか? 私は.net 4.0を使用しています。

4

1 に答える 1

0

これは STE の使用方法として想定されていません。STE は多くのロジックをラップしますが、 context に関連付けられた重複キーを処理できません。

だから私は2つの解決策を想像することができます:

  • 変更を比較するためにエンティティを読み込まないでください。代わりに、STE から変更を適用し、SavingChangesイベントを処理 (またはSaveChangesコンテキストでオーバーライド) して、適用された変更を から取得しますObjectStateManager
  • STE から変更を適用する前に、ロードされたエンティティをデタッチしてみてください。
于 2011-01-18T08:56:22.727 に答える