我应该何时更新数据库以反映属性更改
本文关键字:属性 何时 更新 数据库 我应该 | 更新日期: 2023-09-27 18:25:16
我是WPF的新手,我正在用Linq-to实体(和SQLite数据库)构建一个小型应用程序。
我只是想知道,当属性发生更改时,我必须在哪里调用我的方法才能更新数据库?我想在ViewModel中的属性中这样说:
public string FirstName
{
get
{
return this.person.FirstName;
}
set
{
this.person.FirstName = value;
OnPropertyChanged("FirstName");
this.person.updateFirstname(value);
}
}
我不确定这是否是最好的解决方案。。。
何时保存到数据库的问题产生了工作单元模式。Linq to Entities通过ObjectContext合理地实现了这一点,其中数据在上下文中排队,然后在逻辑工作单元完成时保存到数据库中。
在您的示例中,您已经在L2E实体Person上设置了属性,该实体可能已连接到上下文。当您调用ObjectContext.SaveChanges时,将在不需要updateFirstname
方法的情况下保存它。
您必须决定何时调用ObjectContext.SaveChanges
(从而结束工作单元),并且在用户显式保存或关闭表单时这样做(可以选择建议用户提交或放弃更改)是一种合理的方法。为了实现这一点,视图模型引用ObjectContext,并可以在执行用户操作(通常使用视图模型发布并绑定到视图的WPF ICommand
进行建模)时调用SaveChanges
方法。
您应该将更新集中在工作单元上,而不是单个字段上。如果数据库被正确规范化,那么每一行都将代表一个实体,并且应该被视为一个实体。对实体的更新应该使实体处于"有效"状态。在你的场景中,如果你更新了某人的名字,同时又想更新姓氏,如果应用程序或服务器炸毁了你的个人记录,那么你的记录将无效。
就MVVM而言,我通常要么采用网格的"一次更新整行"策略,并将该事件路由到视图模型中,要么只给它们一个保存按钮:)
最好将服务接口注入ViewModel构造函数,并使用某种类型的服务来更新数据库。通过这种方式,您最终会得到松散耦合的系统,并且您的ViewModel对您的数据访问层保持不可知,因为它应该。。。