0

私はEntityFramework+ Self-Trackingエンティティを使用していて、問題が発生しました。

エンティティがいつ変更されたかを判断する方法はありますか?

例:名前とパスワードの2つのフィールドを持つエンティティUserがある場合、Userインスタンスが変更されたかどうかを知ることができます。

<user>.ChangeTracker.State != ObjectState.Unchanged;

私の問題は、ユーザー個人がいて、その個人に「電子メール」フィールドがある場合です。メールフィールドを変更すると、対応するユーザーも変更されるようにしたいと思います。

私は次のような方法を試してきまし<user>.StartTrackingAll();たが、これはナビゲーションプロパティでは機能しません(または、何か間違ったことをしている可能性があります)。これに関するいくつかのヘルプはここにあります。

自己追跡エンティティはT4テンプレートを介して自動生成されるため、クラスを変更できないことに注意してください。

4

2 に答える 2

0

まず、いわゆるオブジェクト グラフ内のエンティティが変更されたかどうかを知りたい場合は、追跡可能なコレクションに含まれるすべてのエンティティまたはルート エンティティ (この場合はユーザー) の 1 対 1 のナビゲーション プロパティを再帰的に調べることができます。このようにして、ルート エンティティ内の人が変更されたかどうかを知ることができます。これは実際に、含まれているエンティティの変更について複雑なオブジェクト グラフをチェックする方法です。ただし、これらのエンティティのいずれかに重大な検証エラーがあるかどうかを確認するためにも使用されます (そのため、ユーザーはまだエラーを保持できません)。

セルフ トラッキング エンティティは T4 テンプレートを介して自動生成されるため、クラスを変更できないことに注意してください。

違います。まず、T4 テンプレートを変更して、より多くの (複雑な) コードを生成し、目的を達成することができます。次に、カスタム (非生成) コードで簡単に拡張できる部分クラスを生成します。

于 2011-07-12T20:09:21.710 に答える
0

インスタンスの電子メールを変更すると、そのPersonインスタンスのみが変更済みとして正しくマークされます。それは絶対に正しい行動です。あなたは何を期待していますか?関連エンティティのプロパティへの変更が、変更された状態を関係に伝播すると予想しますか? エンティティ グラフを 1 回変更すると、グラフ内のすべてのエンティティが変更され、この変更ごとにデータベースへの追加のラウンドトリップが発生するため、STE は完全に役に立たなくなります。

メールを変更するときに変更済みとして設定したい場合Userは、単にメソッドを作成するか、イベントを処理して呼び出しますperson.User.MarkAsModified()

于 2011-07-13T20:49:04.107 に答える