Есть ли простой способ узнать, была ли запись LINQ to SQL изменена? - PullRequest
0 голосов
/ 19 марта 2009

У меня есть простая процедура, которая заполняет запись в таблице. У меня есть поля, которые я хочу обновить, только если произошло фактическое изменение. Функция может быть вызвана, даже если пользователь ничего не изменил. Есть ли простой способ узнать, произошли ли изменения? Вот функция:

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 и т. Д., Потому что может быть много полей, и вы должны принимать во внимание Ничто для каждого из них, бла-бла л. Есть ли способ просто спросить «форму», если назначения действительно что-то изменили? Я знаю, что за кулисами обновление базы данных не будет производиться, если ничего не изменилось, но выставлено ли это мне до того, как я передам изменения?

Ответы [ 2 ]

2 голосов
/ 19 марта 2009

О таких вещах можно позаботиться в самом DataContext.

Например, вы можете использовать методы UpdateXXX, чтобы отследить изменения объектов и записать вашу дату.

Итак, чтобы обратиться к вашему примеру (при условии, что у вас есть класс с именем MyTable), в вашем DataContext:

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

Насколько я могу судить, DataContext обнаружит, произошли ли изменения, и вызовет этот метод только для актуальных обновлений (но я могу ошибаться в этом, я проверю).

0 голосов
/ 19 марта 2009

Похоже, вы просто хотите установить дату изменения, но только если есть изменения. Я справился с этим, используя частичную реализацию класса и зарегистрировав обработчик события PropertyChanged в частичном методе OnCreated, который вызывается в конструкторе по умолчанию в коде конструктора. В обработчике изменения свойства я обновляю поле данных модификации (если, конечно, это свойство не обновляется). Обратите внимание, что я также установил поле поддержки напрямую, чтобы событие не было обновлено из-за моих изменений.

Пример (извините за 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...