2012-04-10 10 views
3

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

これは、INotifyPropertyChanging/INotifyPropertyChangedを実装していないエンティティで動作する必要があります。

答えて

0

パブリックAPIでこれを行う方法が見つかりませんでした。しかし、少し反射して(そして、好ましくは、some compiled expressions to invoke any methods, constructors, and get accessors)周りにうんざりしていたら、データを得ることができます。ここで

は、あなたがする必要があるものです:

  1. はあなたのDataContextインスタンスのプライベートservicesフィールドへの参照を取得します。
  2. System.Data.Linq.ChangeProcessorのインスタンスを作成します。これはDataContext.GetChangeset()を呼び出すときに実際に使用される内部クラスです。ステップ1のservicesへの参照と、DataContextインスタンスへの参照を渡します。
  3. ChangeProcessorインスタンスに対して、プライベートでパラメータなしのGetOrderedListメソッドを呼び出します。これはあなたにList<TrackedObject>を与えるでしょう。残念ながら、TrackedObjectも内部クラスであるため、リフレクションを使用してプロパティにアクセスする必要があります。
  4. 私たちが探しているオブジェクトはTrackedObjectインスタンスのCurrentOriginalプロパティです。また、IsNew,IsModifiedIsDeletedなどの有用なプロパティもあります。これらのプロパティはすべて自明で、IsInterestingもあります。これは3つの前のプロパティのいずれかが真であると仮定しています。

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

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); 
}); 
関連する問題