2009-12-22 56 views
5

我們正在編寫一個使用實體框架(具有RIA服務的Silverlight精確)的WPF應用程序。我們通過應用程序使用共享的ObjectContext,以便我們可以通過模塊共享數據獲益。Windows/WPF/Silverlight應用程序中的實體框架ObjectContext

問題是 - 如果用戶在工作期間打開讓我們說歷史銷售,它將被加載到ObjectContext並保持到應用程序結束。所以應該使用另一種模式。

我知道ObjectContexts應該用作單個工作單元。但是,那麼,您如何讓應用程序的其他部分知道某些內容已更改,並且應該重新加載其數據?

編輯:好吧,EventAggregator,但是,然後,這將導致所有其他部分重新加載它們(可能大部分是重複的)數據。所有類型的企業集團也可能需要許多事件。

你如何解決這些問題?我目前的解決方案是一種妥協 - 爲共享應用程序使用的核心數據使用共享的ObjectContext,以便它們可以自動共享和更新。對於大量的數據,使用一個新的單獨的ObjectContext。任何更好的想法?

有沒有辦法如何從他們的DataContext中「釋放」實體,以便垃圾收集器可以完成它的工作並釋放內存?

回答

2

等一下,是WPF還是Silverlight?在這種情況下,他們是非常不同的,我的答案會有所不同。

WPF解決方案

在WPF中我會創建每個表單單一的ObjectContext。這樣,上下文將只持續與表單本身一樣長。然後,您應該實施一個事件系統,以便在保存對實體的更改時,可以提醒其他表單可能需要刷新其數據(例如,INotifyPropertyChanged)。 Oren Eini wrote a pretty good article on this architecture using NHibernate in MSDN magazine。你應該能夠從他的文章中獲得建築理念。

Silverlight的解決方案

現在,Silverlight是不同的。 Silverlight實質上只允許你在你的應用程序中擁有一個表單。是的,您可以使用一些技巧將表單的根視覺導航到不同的「頁面」,但它仍然只有一種形式,並且用戶無法在一個Silverlight RIA中打開多個窗口。因此,我會爲每個Silverlight RIA實例製作一個.Net RIA Services ObjectContext。請記住,RIA服務並不是與數據庫的實際連接,它只是一個鏈接到Web服務的緩存和更改跟蹤對象。因此,將這個對象留在更長的時間段是完全可以接受的,因爲它並不佔用任何服務器資源。如果您的Silverlight RIA打開多個瀏覽器窗口或具有多個Silverlight對象,那麼您應該爲每個Silverlight實例創建一個ObjectContext。

在服務器上,您在Web服務中使用了一個實體框架ObjectContext,它應該只在一個請求期間生存。您可以提供更多的無狀態服務,他們將具有更高的可擴展性和高性能。你想打開你的EF ObjectContext,使用它,並儘快關閉它。


編輯:

如果所有你想要做的是從對象上下文分離的對象,那麼你可以使用context.Detach(entity)方法。你可以找到一個example of how to do this on MSDN

+0

有了這個應用程序,我們正在討論Silverlight。使用Prism/Caliburn,我認爲每個視圖(模塊?)都有一個ObjectContext是沒有問題的。同樣,如果有很多數據要加載到客戶端,問題是什麼? 就我而言,最好的解決方案是爲通過整個應用程序使用的基本實體創建一個共享的ObjectContext,以便它們自動同步,並分離ObjectContexts以加載大量數據。一些歷史報道。 – gius 2010-01-03 23:06:52

+0

我不會嘗試發送真正的大塊數據給客戶端。相反,我會在服務器上進行過濾,並只返回客戶希望在那一刻看到的結果。人類無法讀取100,000條記錄,因此不要將這麼多記錄發送給人類。相反,讓問題成爲搜索/過濾器,並只將結果發送給客戶端。如果您正在構建報告,請在服務器上創建彙總彙總數據。例如,計算服務器上的每月銷售量並向客戶端發送單個數字比查看5000條銷售記錄更好。 – 2010-01-04 18:03:59

+0

的確如此,但如果用戶在應用程序生命週期中的任何時候都能看到,比如說第1,10,20頁,那麼這些數據仍將存儲在內存中。另一方面,使用單獨的ObjectContext和數據分頁可以解決大數據駐留內存問題。 – gius 2010-01-04 19:03:10

1

您可以使用存儲庫模式。 UI和DAL之間的另一層抽象。

使存儲庫中的數據收集爲靜態和可觀察的。然後,無論何時更新其中的任何一個,UI層都應該趕上。啓發一個想法。

+0

這不解決我的問題 - 集合會留在客戶端上,所以如果有例如數據庫中的1GB數據遲早會加載到客戶端上。另一方面,這可能會顯示一個可能的解決方案。感謝您的想法! – gius 2009-12-22 22:40:43

0

在ObjectContext中使用ObservableCollections。使用在NotifyPropertyChange上觸發的事件。在視圖模型之間使用發佈/訂閱模式來通知其更改並使用它更新其他視圖。

+1

EF創建的所有集合都是ObservableCollection,實體使用NotifyPropertyChanged。問題是我不能在整個應用程序生命週期中只使用ObjectContext,因爲一旦將它們加載到應用程序中,就不會從內存中釋放數據。 另一方面,對每個單獨的操作使用單獨的ObjectContext會導致刷新數據時出現問題 - 相同的數據將從多個位置加載多次,並且同步將意味着每種數據的自定義事件。 主要問題是有什麼框架/模式解決這個問題。 – gius 2010-01-03 22:58:37

相關問題