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

4

我是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个回答

2
何时保存到数据库的问题引发了工作单元模式。Linq-to-Entities使用ObjectContext对其进行了合理的实现,其中数据在上下文中排队,然后在逻辑工作单元完成时保存到数据库。
在您的示例中,您已经设置了L2E实体Person的属性,这很可能与上下文相关联。当您调用ObjectContext.SaveChanges时,它将被保存,无需使用updateFirstname方法。
你需要决定的是何时调用 ObjectContext.SaveChanges(从而结束工作单元),在用户明确保存或关闭表单时执行此操作(可选择提示用户提交或放弃更改)是一个合理的方法。为了实现这一点,你的视图模型引用 ObjectContext,并且可以在用户执行操作时(通常使用由视图模型发布并绑定到视图的 WPF ICommand )调用 SaveChanges 方法。

谢谢,我之前不知道ObjectContext,我会去了解一下。 - Peekyou
如果您正在使用 Linq-to-Entities 获取“Person”,那么如果不使用“ObjectContext”,您还能以什么方式进行查询? - codekaizen
抱歉,实际上我正在使用它,但我不知道它被称为ObjectContext... - Peekyou
好的,那么你已经完成了大部分工作。你可能想在Person实体上调用SaveChanges来保存你所做的更改。 - codekaizen
那么在这种情况下,ObjectContext.SaveChanges 将从他的 VM 中调用,因此 VM 将与包含他的 EF 模型的 DAL 紧密耦合?或者也许忘记 DAL,只需在主项目中创建 EF 模型?无论项目大小如何,都不认为这是一个好主意... - Dean Kuga
显示剩余5条评论

0

你应该将更新集中在工作单元上,而不是个别字段上。如果你的数据库被正确规范化,每一行都代表一个实体,并且应该被视为这样,对实体的更新应该保持实体处于“有效”状态。在你的场景中,如果你更新一个人的名字并打算同时更新姓氏,如果应用程序或服务器崩溃,你的人员记录将无效。

就MVVM而言,我通常要么利用网格的“一次更新整个行”的策略并将其路由到视图模型,要么只是给他们一个保存按钮 :)


0
最好将服务接口注入到您的ViewModel构造函数中,并使用某种类型的服务来更新数据库。这样,您就可以得到一个松散耦合的系统,而且您的ViewModel保持对数据访问层的不可知状态,正如它应该做的那样...

他没有使用服务进行注入,而是专门使用Entity Framework。 - codekaizen
这对于一个非常小的应用程序来说是否合理? - Peekyou
@Peekyou - 这是合理的,但可能不需要,因为您明确地使用了Entity Framework。恐怕这是一种通用的非答案,对您没有什么帮助。 - codekaizen
@codekaizen 那么有什么阻止你在服务中使用 EF 的呢? - Dean Kuga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接