2008-11-06 3 views
4

У меня есть форма, которая используется для Вставка/дисплей и обновление. В режиме редактирования (update), когда я передаю свой BO обратно контроллеру, какой наилучший способ проверить, было ли изменено какое-либо из значений свойств, чтобы выполнить обновление в хранилище данных?Обнаруживать изменения значений свойств объекта .NET?

textbox1.text = CustomerController.GetCustomerInformation(id).Name 

Объект клиента возвращается с контроллера. Мне нужно проверить, загрязнен ли объект, чтобы выполнить обновление. Я бы предположил, объект посланный от клиента должен быть по сравнению с посланным от контроллера, когда я делаю:

CustomerController.Save(customer) 

Как это обычно делается?

+0

ответы являются хорошим первым шагом, но что, если свойство возвращается к исходному значению, прежде чем переходить к базе данных? Затем объект больше не загрязняется. Это то, о чем до сих пор не сказано ни одним из ответов ... – Brendan 2012-11-07 17:09:10

ответ

3

Хороший способ состоит в том, чтобы иметь флаг IsDirty на объекте и иметь все настраиваемые свойства, обновляющие этот флаг, если они изменены. Если объект загружен, флаг инициализируется на значение false.

Пример свойство будет выглядеть следующим образом:

public string Name { 
    get { return _name; } 
    set { 
     _name = value; 
     _isDirty = true; 
    } 
} 

Затем, когда вы получите объект обратно вы можете просто проверить, Customer.IsDirty чтобы увидеть, если вам нужно, чтобы зафиксировать изменения в базе данных. И в качестве дополнительного бонуса вы получите какой-то юмор из полученного текста :) (oh эти грязные клиенты)

Вы также можете выбрать всегда сохранять объект независимо от того, было ли оно изменено, я предпочитаю использовать флаг.

+0

Поместите свойство IsDirty в объект BaseObject, который будет наследовать Клиент. – Kon 2008-11-06 16:46:48

1

Я не эксперт, но я бы использовал свойство boolean flag на объекте, чтобы указать, что он грязный. Я был избит до ответа lol.

3

Посмотрите на интерфейс INotifyPropertyChanged. Более подробное объяснение того, как его реализовать, доступно here.

1

Обратите внимание, что подход «грязного флага» (в его простой форме) работает для типов значений (int, bool, ...) и строк, но не для ссылочных типов. Например. если свойство имеет тип List<int> или Address, вы можете сделать его «грязным», не вызывая метод setter (myCust.Address.City = "..." вызывает только метод getter).

Если это так, то вы можете найти полезным подход отражения на основе (добавьте следующий метод к вашему BO):

public bool IsDirty(object other) 
{ 
    if (other == null || this.GetType() != other.GetType()) 
    throw new ArgumentException("other"); 

    foreach (PropertyInfo pi in this.GetType().GetProperties()) 
    { 
    if (pi.GetValue(this, null) != pi.GetValue(other, null)) 
     return true; 
    } 
    return false; 
} 

Вы можете использовать его как это:

Customer customer = new Customer(); 
// ... set all properties 
if (customer.IsDirty(CustomerController.GetCustomerInformation(id))) 
    CustomerController.Save(customer);