2011-02-27 55 views
0

我正在開發一個使用實體框架和WPF以及MVVM設計模式的應用程序。我有許多實體,但爲了簡單起見,我們只需處理其中的一部分。可以包含聯繫人,地址和電話號碼的公司;上述聯繫人包含地址,電話號碼和貨件。加載大圖並將它們分離

本來我是加載從數據庫中這些實體和離開開放以後再次使用的DataContext。這表示來自併發方面的問題,因爲任何得到更新的對象可能都不能在程序的其他部分正確表示,因爲這些部分尚未更新。

我嘗試新的東西。在我的MainViewModel中(可以很容易地從任何其他ViewModel訪問),我有幾個ObservableCollections(我使用WPF Databound對象時選擇的通用集合),我打算暫時存儲我的實體。還有幾個方法將負責添加實體到上下文,附加,分離,保存更改等。在我的記錄集合顯示ViewModels(例如CompaniesViewModel)我有一個背景工作負載實體,分離它們,並將它們存儲在MainViewModel的集合中。不幸的是,我顯然必須建立明確的查詢,如:

Dim results = From Comp As Company In RVShipContext.Companies _ 
    .Include("Contacts.PhoneNumbers") _ 
    .Include("Addresses") _ 
    .Include("PhoneNumbers") Select Comp 

你要知道,這與其說是一個問題,當談到時間來加載了聯繫,除了現在我要回去(附,查詢,分離)以獲取地址和貨件。現在,我沒有一個真正的問題,但其中一些圖形將深入幾層。一個Shimpent包含一個或多個軟件包包含一個或多個DiskSets包含多個磁盤。

有沒有一種方法可以輕鬆裝入大圖使用分離的實體是什麼時候? 有沒有辦法有效地使用LazyLoading使用分離的實體? 是否讓我的實體保留在一組中央集合中(可以通過程序的其他部分訪問)是一個好主意,還是應該在我花費過多時間爲其設置基礎結構之前放棄它?

任何幫助將不勝感激!

回答

1

你應該放棄你目前的做法。我不明白WPF是一個VMMV,但是在MVP(model-view-presenter)的情況下,您應該爲每個Presenter使用一個ObjectContext/DbContext實例並保持您的實體連接。檢查this article - 這是關於NHibernate的,但原理是一樣的。 VMMV應該使用類似的方法。

的查詢的複雜性看起來你要加載的一切共享上下文,這是非常problematic solution。特別是像WPF應用程序這樣的有狀態應用程序中的實體分離看起來像是很大的開銷,並且在將更改附加到上下文時需要做很多工作,而不是使用附加實體並讓上下文跟蹤您的變化。附加的實體也可以通過延遲加載來解決問題。

+0

如果我保持DataContexts每個視圖和一個還活着,我怎麼可以在視圖之間管理併發?有時我可能會打開10個編輯貨件視圖,每個視圖都讀取DiskSets和DiskSpecs。最初我有一個附加到我的主ViewModel的事件,當一個實體被更新時會被解僱,並且會警告其他ViewModel,但是我遇到了一些問題。 – CodeWarrior

+0

只能將數據真正保存到數據庫,才能處理併發性。因此,您仍需要10份數據,因爲在其他視圖中處理未保存的數據是沒有意義的。所以事情看起來像要走。當一個視圖保存更改時,觸發事件並通知其他視圖,並且可以刷新其數據。 –

+0

那麼,我會猜測。現在我已經有一段時間在Entity Framework上得到了不同的建議。首先,它具有內置的更改跟蹤功能,只有在保持活動狀態且不分離實體的情況下才能使用該功能。但是,人們認爲上下文應該作爲工作單位來使用...... *舉起雙手* – CodeWarrior

相關問題