2012-02-21 74 views
3

我是WPF的新手,我正在用Linq To Entities(和SQLite数据库)构建一个小应用程序。何时更新数据库以反映财产更改?

我只想知道,当属性发生变化时,我必须在哪里调用我的方法以更新数据库? 我会在这样的视图模型的财产说:

public string FirstName 
{ 
    get 
    { 
     return this.person.FirstName; 
    } 
    set 
    { 
     this.person.FirstName = value; 
     OnPropertyChanged("FirstName"); 
     this.person.updateFirstname(value); 
    } 
} 

我不知道这是否是最好的解决办法...

回答

2

的时候保存到数据库中产生了Unit of Work pattern的问题。 Linq-to-Entities与ObjectContext合理实现了这一点,其中数据在上下文中排队,然后在逻辑工作单元完成时保存到数据库。

在您的示例中,您已经在L2E实体Person上设置了属性,该属性可能与上下文相关。当您拨打ObjectContext.SaveChanges时,无需使用updateFirstname方法即可保存。

你必须决定什么时候调用ObjectContext.SaveChanges(并因此结束工作单元),并在用户明确保存时或表单关闭时执行此操作(可选择支持用户提交或放弃更改)在这里是一个合理的方法。为了实现这个,你的视图模型引用了ObjectContext并且可以在用户动作(通常用WPF ICommandpublished by the viewmodel and bound to the view)执行时调用SaveChanges方法。

+0

谢谢,我没有意识到ObjectContext,我会研究这个 – Peekyou 2012-02-21 20:31:41

+0

如果你正在Linq-to-Entities中的'Person',你还在查询是否不使用ObjectContext? – codekaizen 2012-02-21 20:35:01

+0

哼哼对不起,其实我正在使用它,但是我不知道它叫做ObjectContext ... – Peekyou 2012-02-21 20:38:25

0

您应该将更新集中在工作单元周围,而不是围绕单个字段。如果你的数据库被正确化了,每一行都会代表一个实体,并且应该这样对待,实体的更新应该使实体保持“有效”状态。在你的情况下,如果你更新人的名字,意图同时更新姓氏,如果应用程序或服务器炸毁你的人员记录将是无效的。

在MVVM而言,我通常要么对电网的捎带“更新整个行一次”战略和路由事件到视图模型或我只是给他们一个保存按钮:)

0

最好是注入一个服务接口到您的ViewModel构造函数并使用某种类型的服务来更新数据库。 这样你最终与松散耦合的系统和你的ViewModel保持不变,你的数据访问层,因为它应该...

+0

他没有使用服务来注入,他特别使用实体框架。 – codekaizen 2012-02-21 20:29:08

+0

这对于一个非常小的应用程序是否合理? – Peekyou 2012-02-21 20:30:26

+0

@Peekyou - 这是合理的,但可能不需要,因为你明确使用实体框架。这恐怕是一种通用的非答案,对你来说帮不了什么大忙。 – codekaizen 2012-02-21 20:33:45

相关问题