2009-06-29 4 views
3

私はVSデザイナーによって生成されたlinqtosqlクラスを拡張しようとしており、特定のフィールドの値が変更されたかどうかを判断する必要があります。テーブル/エンティティのDataContext Updateメソッドのフィールドの前後の値にアクセスする方法はありますか?ここでlinqtosqlパーシャルDataContextクラスの実装 - 前後の値の検査方法

は私のコードです:

public partial class DataClassesDataContext 
{ 
    partial void UpdateActivity(Activity instance) 
    { 
     this.ExecuteDynamicUpdate(instance); 
     //need to compare before and after values to determine if instance.AssignedTo value has changed and take action if it has 
    } 
} 

私も値が変更されたかどうかを知らせるために活動エンティティクラスにプロパティを追加することに開いているが、私は価値がある場合は教えする方法を見つけ出すことはできませんそこにも変わった。 ActivityクラスのOnAssignedToChangedメソッドを使用することはできません。なぜなら、プロパティ値が設定されていても必ずしも変更されないためです。 ListViewとLINQDataSourceコントロールを使用して更新しているので、何も関係なく設定されます。

また、OnAssignedToChangingメソッドを使用できる可能性がありますが、Activityインスタンスがその時点で現在の値を持っていないように思えます。 this.AssignedToは常にnullであるため、次のコードは機能しません。

partial void OnAssignedToChanging(int? value) 
{ 
    if (value != this.AssignedTo) 
    { 
     _reassigned = true; 
    } 
} 

答えて

9

あなたがこれを行うことができるようになります。

public partial class DataClassesDataContext 
{ 
    partial void UpdateActivity(Activity instance) 
    { 
     Activity originalActivity = Activities.GetOriginalEntityState(instance); 
     if (instance.Property != originalActivity.Property) 
     { 
      // Do stuff 
     } 
     this.ExecuteDynamicUpdate(instance); 
     //need to compare before and after values to determine if instance.AssignedTo value has changed and take action if it has 
    } 
} 

別の方法:私はちょうどあなたの他のオプション(OnAssignedToChanging(int? value))にチェックインし、ために正常に動作するようです

public partial class DataClassesDataContext 
{ 
    partial void UpdateActivity(Activity instance) 
    { 
     ModifiedMemberInfo[] changes = Activities.GetModifiedMembers(instance); 
     foreach (var change in changes) 
     { 
      Console.WriteLine("Member: {0}, Orig: {1}, New: {2}", change.Member, change.OriginalValue, change.CurrentValue); 
     } 

     this.ExecuteDynamicUpdate(instance); 
     //need to compare before and after values to determine if instance.AssignedTo value has changed and take action if it has 
    } 
} 

私。初期値が実際にはnullではないと確信していますか?私は新しいオブジェクトだけでなく、データベースから取得したものを使ってテストしたところ、正しく動作するように見えました。

+0

部分的な方法? ;) – Kezzer

+0

ええ、何か不足していますか?部分的なメソッドが.NET 3.5で追加されました - 興味があればそれらを見てください:) –

+0

基本的に、部分クラスは部分的なメソッドを宣言していますが、定義することはできません。必要に応じて別のファイルに実装することができます。そうしないと、関連するすべてのメソッド呼び出しが存在しないかのように機能します。 –

関連する問題