實體框架不允許在多個數據庫上下文之間共享相同的實體。因此,我必須在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的正確方法是什麼?有沒有辦法將單個查詢卸載到不同的線程上,而不會使整個應用程序異步,即是否有一種簡單的方法來實現它?
但是你可以有一個調用創建一個dbcontext,打開一個連接,執行一個查詢,處理結果並返回一個列表/數據集,不是嗎? – rene
@rene它是GUI應用程序。所請求的實體被編輯,連接的實體被創建/編輯,自動完成和其他對實體進行操作的特徵。如果我從一個dbcontext獲取一個實體,然後將另一個實體從另一個dbcontext放入其導航屬性中,EF將會投訴。這些操作是分開的,我不知道用戶需要什麼實體。 – Athari
根據我的經驗,使用EF作爲從上到下的ORM,除了最簡單的GUI之外,其實都是瘋狂的道路。需要在內存中擁有多個實體並連接到上下文,這表明您正在與EF進行業務邏輯處理,而這正是引發這種問題的原因。相反,請考慮嚴格使用它作爲DAL來處理單獨對象模型的CRUD函數。 – superstator