2010-05-20 33 views
7

我正在開發使用實體框架(.NET 3.5)的WPF應用程序。它在整個地方訪問實體。我擔心貫穿整個應用程序的一致性。我是否應該在不同的視圖中實例化單獨的上下文,還是應該(並且是一個很好的方法)實例化一個可以在全局範圍內訪問的上下文?例如,我的實體模型包含三個部分:貨件(包含子包和其他子內容),公司/聯繫人(包含子地址和電話)以及磁盤規格。 Shipments和EditShipment視圖訪問DiskSpecs,而OptionsView管理DiskSpecs(創建,編輯,刪除)。如果我編輯一個DiskSpec,我必須在ShipmentsView中有一些東西來檢索最新的規格,如果我有單獨的上下文嗎?WPF應用程序中的全局實體框架上下文

如果可以安全地從應用程序的其餘部分獲取一個總體上下文,那麼我想這就是要走的路。如果是這樣,該實例將放在哪裏?我使用VB.NET,但我可以從C#翻譯很好。任何幫助,將不勝感激。

我只是不希望其中的一個應用程序,用戶不得不在應用程序的不同部分重新加載十幾次以獲取新數據。

更新:

  1. 所有上下文中使用塊,他們不再需要後處理掉的創建:

    行,所以如下我已經改變了我的應用程序。

  2. 加載時,所有實體在處理前都從上下文中分離出來。
  3. MainViewModel(ContextUpdated)中的新屬性引發了所有其他ViewModel預訂的事件,該事件運行ViewModels RefreshEntities方法。
  4. 執行此操作後,我開始出現錯誤,指出某個實體一次只能由一個ChangeTracker引用。由於我無法弄清楚哪個上下文仍在引用該實體(不應該是任何上下文?),我將該對象作爲IEntityWithChangeTracker轉換,並將SetChangeTracker設置爲空(Null)。

這讓當前的問題: 當我null值,實體的changeTracker,然後將其連接到一個背景下,它失去了它的狀態發生了改變,並沒有更新到數據庫中。但是,如果我不更改更改跟蹤器,我無法附加。我有我自己的更改跟蹤代碼,所以這不是問題。

我的新問題是,你應該如何做到這一點。一個很好的示例實體查詢和實體保存代碼會被剪掉很長一段時間,因爲我試圖獲得我曾經認爲是一個簡單的事務才能工作。

+0

如果你downvote,我很樂意解釋。至少它會讓我知道什麼不該在路上進一步做。 – CodeWarrior 2012-12-03 19:20:10

回答

5

全局靜態上下文很少是正確的答案。考慮如果在執行此應用程序期間重置數據庫會發生什麼情況 - 您的SQL連接消失,並且所有使用靜態上下文的後續請求都將失敗。

推薦你找到一個方法來對你的實體背景下更短的生命週期 - 打開它,做了一些工作,處理它,...

至於把你的不同對象在同一EDMX,這幾乎肯定是正確的答案,如果他們在同一個EDMX中需要它們的對象之間有任何關係。

至於重新加載 - 用戶不應該這樣做。在幕後,您可以打開一個新的上下文,從數據庫重新加載對象的當前版本,應用他們在UI中進行的更改並將其保存回去。

您也可能希望查看分離的實體,並且當您嘗試保存更改並且其他人已更改數據庫中的同一對象時,要小心樂觀併發異常。

+0

好吧,如果我使用多個上下文,一個上下文將如何知道刷新的數據。我是否會監視由其他上下文設置的propertychanged事件? – CodeWarrior 2010-05-21 02:11:03

+0

當應用程序處於空閒狀態時,上下文應該關閉並消失。你所擁有的只是在這種狀態下的DTO或detatched實體。當有人點擊你打開單個上下文的東西時,重新連接你的實體或重新加載它們並應用UI中的更改,然後調用savechanges處理它可能拋出的任何樂觀併發異常,然後更新你的視圖並最終處理上下文。將上下文想象爲一個單一的工作單元。 – 2010-05-21 02:18:53

+0

這代表了我如何查看EF功能的根本性變化。我的印象是,上下文有望引用從數據創建的對象,直到視圖模型處理它(處理視圖時)。 目前我有我的ViewModels通過EF加載Shipment對象,這些對象被加載到自定義集合中並顯示在視圖中。對內存對象進行更改後,我調用保存更改並使用相同的上下文(對嗎?)更新服務器。如果這是不正確的,當我保存更改時,它的工作方式是否有所不同? – CodeWarrior 2010-05-21 02:33:47

3

好問題,Cory。大拇指從我身上。

實體框架爲您提供了一個自由選擇 - 您可以實例化多個上下文或者只有一個靜態實例。它在兩種情況下都能很好地工作,是的,兩種解決方案都是安全的。我可以給你的唯一有價值的建議是:試驗兩者,衡量表現,延誤等,併爲你選擇最好的一個。這很有趣,相信我:)

如果這將是一個具有大量併發連接的真正巨大的應用程序,我會建議使用一個靜態上下文或一個靜態,核心上下文,只是爲了支持主要的上下文。但是,由於我只寫了幾行以上 - 這取決於您的需求哪種解決方案更適合您。

我特別喜歡你的問題的這部分:

我只是不想當用戶打 不同 部分應用程序的加載了十幾次獲得這些 應用之一新的數據。

WPF是一個非常非常強大的工具,基本上用戶不得不按下按鈕刷新數據的時間已經一去不復返了。 WPF爲您提供了非常廣泛的異步多線程工具,例如Dispatcher類或Background工作程序,以在後臺輕鬆刷新所需的數據。這真的很棒,因爲不僅您不必擔心按下各種按鈕,而且後臺線程也不會阻止用戶界面,所以從用戶的角度來看,數據會以透明的方式刷新。

WPF和Entity Framework一起真的值得學習 - 請隨時詢問你是否有任何進一步的問題。

+0

Piotr,請參閱與Hightechrider的對話。我一直在教我自己WPF和EF。我的第一個應用程序非常醜陋而且非常笨拙,但隨着我走,它們變得更加精緻。任何管理ViewModel功能的好資源都會很棒。搜索時會看到很多結果,但大多數都是MVVM等的一般解釋。 – CodeWarrior 2010-05-21 03:48:56

+0

嗨,IMo最適合初學者的MVVM文章就是這樣:http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx這儘可能簡單,爲您提供儘可能多的信息,您需要自己做。請報告你的進度:) – 2010-05-21 06:20:29

+0

那篇文章根本不是關於Entity Framework的。它關於MVVM和TreeView控件。 – CodeWarrior 2011-07-13 15:44:46