4

我有一个用于插入/显示更新的表单。在编辑模式 ( update ) 中,当我将我的BO回传给控制器时,为了执行对数据存储的更新,检查任何属性值是否已更改的最佳方法是什么?

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

从控制器返回一个客户对象。我需要检查对象是否脏了才能执行更新。我假设从客户端发送的对象必须与从控制器发送的对象进行比较:

CustomerController.Save(customer)

这通常是如何完成的?

4

4 回答 4

3

一个好的方法是在对象上设置一个 IsDirty 标志,并让所有可设置的属性在更改时更新该标志。加载对象时将标志初始化为 false。

示例属性如下所示:

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

然后,当您取回对象时,您可以简单地检查一下Customer.IsDirty是否需要将更改提交到数据库。作为额外的奖励,您会从结果文本中获得一些幽默感:)(哦,那些肮脏的顾客

您还可以选择始终保存对象,无论它是否已更改,我的偏好是使用标志。

于 2008-11-06T16:40:53.307 回答
3

看一下INotifyPropertyChanged接口。有关如何实现它的更详细说明,请参见此处

于 2008-11-06T17:05:51.413 回答
1

我不是专家,但我会在对象上使用布尔标志属性来指示它是脏的。我被打败了,哈哈。

于 2008-11-06T16:45:32.050 回答
1

请注意,“脏标志方法”(以其简单形式)适用于值类型(int、bool、...)和字符串,但不适用于引用类型。例如,如果一个属性是List<int>or类型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);
于 2008-11-06T17:25:47.897 回答