我有一个用于插入/显示和更新的表单。在编辑模式( update )中,当我将BO
传递回Controller时,检查是否有任何属性值被更改的最佳方法是什么,以便执行对数据存储区的更新?
textbox1.text = CustomerController.GetCustomerInformation(id).Name
从控制器返回客户对象。我需要检查对象是否脏,以便执行更新。我认为当我这样做时,必须将从客户端发送的对象与从控制器发送的对象进行比较:
CustomerController.Save(customer)
这通常是怎么做的?
答案 0 :(得分:3)
一个好方法是在对象上有一个IsDirty标志,并且如果它们被更改,则所有setable属性都会更新该标志。在加载对象时将标志初始化为false。
示例属性如下所示:
public string Name {
get { return _name; }
set {
_name = value;
_isDirty = true;
}
}
然后,当您获得对象时,您只需检查Customer.IsDirty
以查看是否需要将更改提交到数据库。作为额外的奖励,您可以从结果文本中获得一些幽默:)(哦那些肮脏的客户)
您也可以选择始终保存对象,无论其是否已更改,我的偏好是使用标记。
答案 1 :(得分:3)
查看INotifyPropertyChanged界面。有关如何实现它的更详细说明,请here。
答案 2 :(得分:1)
我不是专家,但我会在对象上使用boolean flag属性来指示它是脏的。我被打败了答案大声笑。
答案 3 :(得分: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);