2012-02-21 101 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

相關問題