是否有一种简单的方法来判断LINQ to SQL记录是否已被更改?

时间:2009-03-19 15:00:17

标签: .net 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

这有点简化 - 我宁愿不检查field1和myval1,field2和myval2等之间的每个关系,因为可能有很多字段,你必须为每一个都考虑Nothing,等等等等。如果作业真的改变了什么,有没有办法只问“形式”?我知道幕后如果没有任何改变就不会进行数据库更新,但是在我提交更改之前是否会暴露给我?

2 个答案:

答案 0 :(得分:2)

你可以在DataContext上处理这类事情。

例如,您可以使用UpdateXXX方法捕获对象的更改并记录日期。

因此,要在您的DataContext上与您的示例(假设您有一个名为MyTable的类)相关联:

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

据我所知,DataContext将检测是否发生了更改并仅调用该方法进行实际更新(但我可能在这个方面出错了,我会检查)。

答案 1 :(得分:0)

看起来您只想设置修改日期,但前提是有更改。我处理它的方法是使用部分类实现并在OnCreated部分方法中注册一个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;
    }
}