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

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

Вот мой код:

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, похоже, не имеет текущих значений приточка.Следующий код не работает как этот. AssignedTo всегда имеет значение null.

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

1 Ответ

9 голосов
/ 01 июля 2009

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

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)), и, похоже, он мне подходит. Вы уверены, что начальное значение на самом деле не было нулевым? Я протестировал его как с новым объектом, так и с объектом, извлеченным из базы данных, и, похоже, он работает правильно.

...