1

EF4(データベースファースト)を使用して、コンテキストレベルで変更監査システムを実装しようとしています。、、またはコンテキストのSaveChanges状態を持つエンティティをオーバーライドしてキャプチャしています。これは通常は機能しますが、どのエンティティにもこの状態がない(コードで変更したエンティティを含む)という問題が発生しましたが、コンテキストにデータベースへの変更があります。状態としてのエントリのリストを確認しましたが、変更したエンティティはそのリストに含まれています。AddedDeletedModifiedObjectStateManagerUnchanged

私が見ることができる唯一の問題は、自己追跡エンティティを使用していることです(これは、通常、変更のためにこれらのSTEをクライアントに送信するWCFサービスであり、クライアントは変更されたSTEのバックアップを渡して変更を永続化します) 。起こっているように見えるのは、サーバー上で取得され、そこで直接変更されたオブジェクト(クライアントに渡されてSTEを使用するのでObjectChangeTrackerはなく)がとしてマークされていないことModifiedです。これは正常/予期される動作ですか?この場合、変更が行われているときに、コンテキストがデータベースに保持する変更を決定するために、以外のものを使用していること明らかです。ObjectStateManager

これらの変更を検出して追跡するにはどうすればよいですか?コンテキストが変更を追跡するために使用しているものを誰かが知っていますか?私はいつもそれがだと思っていましたObjectStateManagerが、そうではないようです。

4

1 に答える 1

2

問題はsaveOptions. これらのオプションには (デフォルトで) が含まれているため、コンテキストは内部DetectChangesBeforeSave的に呼び出しており、変更を取得して の状態を適切に設定します。これを私の監査ルーチンに追加することにより:DetectChangesObjectStateEntry

if ((options & SaveOptions.DetectChangesBeforeSave) == 
               SaveOptions.DetectChangesBeforeSave)
{
    DetectChanges();

    options ^= SaveOptions.DetectChangesBeforeSave;
}

正しく動作するようになりました。

于 2012-05-18T14:56:10.347 に答える