我是WPF的新手,我正在使用Linq To Entities(和SQLite数据库)构建一个小应用程序。
我只想知道,当属性发生变化时,我必须在哪里调用我的方法来更新数据库? 我会在ViewModel的属性中说这样:
public string FirstName
{
get
{
return this.person.FirstName;
}
set
{
this.person.FirstName = value;
OnPropertyChanged("FirstName");
this.person.updateFirstname(value);
}
}
我不确定这是否是最佳解决方案......
答案 0 :(得分:2)
何时保存到数据库的问题产生Unit of Work pattern。 Linq-to-Entities使用ObjectContext对此进行了合理的实现,其中数据在上下文中排队,然后在逻辑工作单元完成时保存到数据库中。
在您的示例中,您已经在L2E实体Person上设置了该属性,该实体可能已连接到上下文。当您致电ObjectContext.SaveChanges时,系统会保存此消息,而无需使用updateFirstname
方法。
您必须决定何时调用ObjectContext.SaveChanges
(从而结束工作单元),并在用户明确保存或表单关闭时执行此操作(可选择为用户提交提交)或丢弃变更)这是一种合理的方法。要实现这一点,您的viewmodel引用ObjectContext,并且可以在执行用户操作(通常使用WPF SaveChanges
published by the viewmodel and bound to the view建模)时调用ICommand
方法。
答案 1 :(得分:0)
您应该将更新集中在工作单元而不是单个字段周围。如果您的数据库已正确规范化,则每一行都将代表一个实体,应将其视为实体,对实体的更新应使实体保持“有效”状态。在您的方案中,如果您更新了人的名字,并且还要更新姓氏,如果应用程序或服务器爆炸,您的个人记录将无效。
就MVVM而言,我通常还是搭载网格的“一次更新整行”策略并将该事件路由到viewmodel中,或者我只是给它们一个保存按钮:)
答案 2 :(得分:0)
最好将服务接口注入ViewModel构造函数,并使用某种类型的服务来更新数据库。 通过这种方式,您最终会得到松散耦合的系统,并且您的ViewModel可以保持与数据访问层无关......