2014-03-26 52 views
7

實體框架不允許在多個數據庫上下文之間共享相同的實體。因此,我必須在GUI應用程序(無論是WPF還是WinForms)中只使用一個數據庫上下文,因爲實體需要相互交互。實體框架+ SQL Server Compact + WPF/WinForms = Sluggish UI?

SQL Server Compact不允許在多個線程之間共享相同的數據庫連接。如果我嘗試在一個線程上創建連接並在另一個線程上運行SQL查詢,那麼我的應用程序可能會崩潰。

因此,我必須在一個線程上創建EF數據庫上下文,並在該線程上運行所有查詢。我使用過GUI線程,因爲幾乎所有的查詢都非常快。但是,現在我的查詢很慢,想要在執行時顯示動畫進度條。

但我不能這樣做,因爲如果我在不同的線程上運行查詢,我的應用程序崩潰與AV。此外,如果我同時運行多個查詢,即使沒有涉及SQL CE,EF似乎也會抱怨。將所有查詢移動到不同的線程中,使用瘋狂的異步/等待,回調,鎖和其他線程化代碼覆蓋所有代碼聽起來也很可怕,因爲如果可能的話,我想簡化代碼。

問題:在多線程GUI應用程序中使用EF數據庫上下文和SQL Server Compact的正確方法是什麼?有沒有辦法將單個查詢卸載到不同的線程上,而不會使整個應用程序異步,即是否有一種簡單的方法來實現它?

+0

但是你可以有一個調用創建一個dbcontext,打開一個連接,執行一個查詢,處理結果並返回一個列表/數據集,不是嗎? – rene

+0

@rene它是GUI應用程序。所請求的實體被編輯,連接的實體被創建/編輯,自動完成和其他對實體進行操作的特徵。如果我從一個dbcontext獲取一個實體,然後將另一個實體從另一個dbcontext放入其導航屬性中,EF將會投訴。這些操作是分開的,我不知道用戶需要什麼實體。 – Athari

+0

根據我的經驗,使用EF作爲從上到下的ORM,除了最簡單的GUI之外,其實都是瘋狂的道路。需要在內存中擁有多個實體並連接到上下文,這表明您正在與EF進行業務邏輯處理,而這正是引發這種問題的原因。相反,請考慮嚴格使用它作爲DAL來處理單獨對象模型的CRUD函數。 – superstator

回答

1

SQL Server CE支持多線程。但是像SqlCeConnection或SqlCeTransaction這樣的對象不是線程安全的。每個線程應該使用一個單獨的連接。 實體框架DataContext實例旨在持續一個工作單元(商務交易)。 The recommendation是每種形式的上下文。

您可以使用DTOs重新設計您的應用程序並存儲/傳輸數據。或者您可以使用實體框架的附加/分離功能(herehere)。或者結合兩者。

+0

只有表單很簡單,每個表單的上下文才能正常工作。假設我在需要慢速查詢的表單中具有搜索功能。如果我將查詢移動到另一個線程,我將無法使用我收到的實體。如果我分離並重新附加它們,我會失去連接的實體,延遲加載和更改跟蹤;我也可能遇到具有相同ID的實體已經連接的情況。如果我使用DTO並且不存儲上下文,結果是相似的,但有更多的代碼和沒有ID衝突。我沒有看到任何不犧牲EF功能主要部分的解決方案。 – Athari

相關問題