Реализация частичного класса DataContext linqtosql - как проверять значения до/после

Я пытаюсь расширить классы linqtosql, созданные дизайнером VS, и мне нужно определить, изменилось ли значение определенного поля. Есть ли способ получить доступ к значениям до и после для поля в методе DataContext Update для таблицы/объекта?

Вот мой код:

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 класса Activity, потому что он срабатывает всякий раз, когда значение свойства установлено, а не обязательно изменено. Я использую элемент управления ListView и LINQDataSource для обновления, поэтому он устанавливается, несмотря ни на что.

Я также подумал, что смогу использовать метод OnAssignedToChanging, но экземпляр Activity, похоже, не имеет текущих значений в этот момент. Следующий код не работает, так как this.AssignedTo всегда имеет значение null.

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

person joshb    schedule 29.06.2009    source источник


Ответы (1)


Вы должны быть в состоянии сделать это:

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
    }
}

Другая альтернатива:

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
    }
}

Я только что проверил другой ваш вариант (OnAssignedToChanging(int? value)), и, похоже, он у меня работает нормально. Вы уверены, что начальное значение на самом деле не было нулевым? Я протестировал его с новым объектом, а также с объектом, извлеченным из базы данных, и, похоже, он работает правильно.

person Ryan Versaw    schedule 01.07.2009
comment
Да, я что-то пропустил? Частичные методы были добавлены в .NET 3.5 — посмотрите их, если вам интересно :) - person Ryan Versaw; 01.07.2009
comment
По сути, разделяемый класс может иметь объявленные, но не определенные разделяемые методы. Затем вы можете при желании реализовать их в отдельном файле. Если вы этого не сделаете, он будет работать так, как если бы все связанные с ним вызовы методов не существовали. - person Ryan Versaw; 01.07.2009
comment
Отлично работает для меня. Спасибо Райан! - person joshb; 01.07.2009
comment
Отличный ответ. Я думаю, что синтаксис немного изменился в .NET 4.5 +1 - person Piotr Kula; 08.05.2013