我应该何时更新数据库以反映属性更改?

时间:2012-02-21 20:09:59

标签: c# wpf data-binding mvvm

我是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);
    }
}

我不确定这是否是最佳解决方案......

3 个答案:

答案 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可以保持与数据访问层无关......