簡體   English   中英

Windows / WPF / Silverlight應用程序中的實體框架ObjectContext

[英]Entity Framework ObjectContext in windows/WPF/Silverlight application

我們正在使用Entity框架編寫WPF應用程序(准確地說,Silverlight與RIA服務)。 我們通過應用程序使用共享的ObjectContext,這樣我們就可以從跨模塊共享數據中受益。

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

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

編輯:好的,EventAggregator,但是,這將導致所有其他部分重新加載他們的(可能大部分重復)數據。 也許所有類型的參與團體都需要許多活動。

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

有沒有辦法如何從DataContext中“釋放”實體,以便垃圾收集器可以完成其工作並釋放內存?

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

WPF解決方案

在WPF中,我將為每個表單創建一個ObjectContext 這樣,上下文只會持續與表單本身一樣長。 然后,您應該實現一個事件系統,以便在保存對實體的更改時,可以提醒他們刷新數據所需的其他表單(例如, INotifyPropertyChanged )。 Oren Eini在MSDN雜志中使用NHibernate在這個架構上寫了一篇非常好的文章 您應該能夠從他的文章中獲得架構概念。

Silverlight解決方案

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

在服務器上,您在Web服務中使用實體框架ObjectContext,它應該僅在一個請求的持續時間內存在 您可以提供服務的無國籍人越多,他們的可擴展性和性能就越高。 您想要打開EF ObjectContext,使用它,並盡快關閉它。


編輯:

如果你想要做的就是從對象上下文中分離一個對象,那么你可以使用context.Detach(entity)方法。 您可以在MSDN上找到如何執行此操作示例

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

使存儲庫中的數據集合靜態和可觀察。 然后每當存儲庫更新其中的任何一個時,UI層應該趕上。 JUst一個想法。

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

在我們的例子中,我們決定實現工廠模式,並在需要時實例化一個新的對象上下文(有時它不會一對一地映射到VM)。

關於對象上下文生命時間的Agreat文章: http//www.silverlightshow.net/items/Silverlight-WCF-RIA-Services-strategies-for-handling-your-Domain-Context-part-one.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM