3

LINQ-to-SQL を使用すると、 を呼び出して更新、挿入、または削除されるオブジェクトの配列のセットを取得できますDataContext.GetChangeSet()。競合がある場合、DataContext.ChangeConflictsプロパティは元のオブジェクトと変更されたオブジェクトへの参照を提供します。競合がなければ、元のオブジェクトと変更されたオブジェクトにアクセスする方法はありますか?

INotifyPropertyChangingこれは、 /を実装していないエンティティに対して機能する必要がありますINotifyPropertyChanged

4

2 に答える 2

3
var db = new DataContext();
db.GetChangeSet().Updates.ForEach(o => {
    var currentObject = o;
    var originalObject = db.GetTable(o.GetType()).GetOriginalEntityState(o);
    var changedProperties = db.GetTable(o.GetType()).GetModifiedMembers(o);
});
于 2012-07-25T03:30:35.287 に答える
0

パブリックAPIを介してこれを行う方法を見つけることができませんでした。ただし、リフレクションを少しいじくりまわす場合(および、できれば、メソッド、コンストラクターを呼び出し、アクセサーを取得するためのコンパイル済み式)、データを取得することは可能です。

これがあなたがする必要があることです:

  1. インスタンスのプライベートservicesフィールドへの参照を取得しDataContextます。
  2. のインスタンスを作成しますSystem.Data.Linq.ChangeProcessor。これは、を呼び出すときに実際に使用される内部クラスですDataContext.GetChangeset()services手順1からの参照と、DataContextインスタンスへの参照を渡します。
  3. インスタンスに対してprivateおよびparameterlessGetOrderedListメソッドを呼び出しChangeProcessorます。これにより、が得られますList<TrackedObject>。残念ながら、TrackedObjectは内部クラスでもあるため、そのプロパティにアクセスするにはリフレクションを使用する必要があります。
  4. 探しているオブジェクトは、インスタンスのプロパティにありCurrentます。また、、、、など、他にも役立つプロパティがいくつかあります。これらはすべて自明です。また、以前の3つのプロパティのいずれかが真であることを表していると思います。OriginalTrackedObjectIsNewIsModifiedIsDeletedIsInteresting

もちろん、これらはすべて内部APIであるため、フレームワークが更新されるときに変更される可能性があります。このロジックを使用する場合は、この点に注意してください。

于 2012-04-11T18:42:45.373 に答える