2009-03-19 15 views
0

私は、テーブルのレコードに値を設定する単純なルーチンを持っています。実際の変更が行われた場合にのみ更新したいフィールドがあります。ユーザーが何も変更しなくても関数が呼び出される可能性があります。変更が生じたかどうかを簡単に知る方法はありますか?ここでは機能があります:LINQ to SQLレコードが変更されたかどうかを確認する方法がありますか?

Sub Edit(ByVal key as Integer, ByVal myval1 As Integer?, ByVal myval2 As Integer?) 

    Dim db As New MyDatabaseDataContext 

    Dim form = (From x In db.MyTables Where x.id = key).SingleOrDefault 

    form.field1 = myval1 
    form.field2 = myval2 

    If [???] Then 
     form.mod_date = Now 
    End If 

    db.SubmitChanges() 

End Function 

これは少し単純化している - 多くの分野があるかもしれないので、私はむしろ、などフィールド1とmyval1、FIELD2とmyval2、間の各関係を確認していないだろう、とあなたは何もしないする必要がありますそれぞれを考慮して、blah blah blah。割り当てが実際に何か変更された場合は、単に「フォーム」と尋ねる方法はありますか?私は変わったことがなければデータベースの更新はしませんが、変更をコミットする前に私に公開されているのですか?

答えて

2

DataContext自体には、そのようなことをすることができます。

たとえば、UpdateXXXメソッドを使用すると、オブジェクトの変更をキャッチして日付を記録できます。

Private Sub UpdateMyTable(ByVal instance As MyTable) 
    instance.mod_date = Now 
    Me.ExecuteDynamicUpdate(instance) 
End Sub 

変更は場所だけコールをとっている場合は私が知る限り、DataContextのが検出されます。だからあなたのDataContextに、(あなたはMyTableという名前のクラスを持っていると仮定して)あなたの例に関連する

実際の更新のためのその方法(しかし、私はこれに間違っている可能性があります、私はチェックします)。

0

変更日が設定されているように見えますが、変更があった場合にのみ表示されます。私がこれを処理した方法は、部分クラス実装を使用し、デザイナーコードのデフォルトコンストラクターで呼び出されるOnCreated partialメソッドでPropertyChangedイベントハンドラーを登録することです。プロパティ変更ハンドラでは、変更データフィールドを更新します(プロパティが更新されていない場合はもちろんそうです)。私は、私の変更のためにイベントが再開されないように、バッキングフィールドを直接設定することに注意してください。

例(C#は申し訳ありませんが、これは私のコードが実装されているものです)。

partial void OnCreated() 
{ 
    this.PropertyChanged += new PropertyChangedEventHandler(Participant_PropertyChanged); 
} 

void Participant_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName != "mod_date") 
    { 
     this._mod_date = DateTime.Now; 
    } 
} 
関連する問題