我有一个简单的例程来填充表中的记录。我有一些字段,如果发生了实际的更改,我只想更新。即使用户没有更改任何内容,也可以调用该函数。有没有简单的方法来判断是否发生了变化?这是功能:
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,等等等等。如果作业真的改变了什么,有没有办法只问“形式”?我知道幕后如果没有任何改变就不会进行数据库更新,但是在我提交更改之前是否会暴露给我?
答案 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;
}
}