2013-08-05 37 views
3

我正在努力解決以下問題。長時間使用實體時在C#中使用EntityFramework

我有一個數據庫與表作業,其中包含有關工作要完成的信息。我遵循EF 6.0的Code First方法並創建了一個名爲Job的POCO類Job。然後我在數據庫中查詢喬布斯:

DbSet<Job> receivedJobs; 
using (var context = new MyContext()) 
{ 
    receivedJobs = (from j in context.Jobs 
      select j); 
} 

與接收到的設置receivedJobs我會再做一個耗時的優化。

據我所知,上下文的生命週期以及上下文控制的資源以using語句的右括號結束。另外一個好的設計應該在資源不再需要時立即將資源釋放。

我的問題是現在我應該怎麼做我的情況?只要保持數據庫上下文一直存在,直到完成耗時的優化任務。或者關閉連接,因爲直到優化結束才需要它。但在後一種情況下,我如何處理對象,因爲我將需要訪問它們的一些導航屬性,而我不能因爲上下文已關閉而導致它們的導航屬性。 (順便說一下,類的實例中的數據不會因優化而改變,因此不需要跟蹤這些對象的更改,因爲不會有這些對象的更改)

希望有人可以幫助我理解這種情況下推薦的設計。

問候

回答

1

你應該始終保持一個上下文,以最少的時間完成操作。就你而言,聽起來你會需要上下文,直到完成優化,因爲你正在使用它的一些方法來瀏覽結果集。如果是這種情況,那麼上下文應該保留,直到你不需要它爲止。

避免的壞習慣是在你沒有立即需要的情況下保持上下文。您將看到一些應用程序在應用程序啓動時錯誤地創建了上下文,並在應用程序的整個生命週期中保留它。這很糟糕,浪費資源。

在你的情況下,把優化代碼放在適當位置,使用上下文直到代碼完成,然後釋放上下文。你的使用聲明將照顧所有的雜亂處置的東西。只需獲取需要使用{}中的上下文的代碼,您應該很好。

+0

謝謝你的建議。我忘了提及以下事情,我剛剛添加到我原來的帖子後,你回答我的問題。 「順便說一下,Job類實例中的數據不會因優化而改變,因此不需要跟蹤這些對象的更改,因爲不會有任何」 此外,優化可以涉及用戶行爲。 即使在這種情況下,我應該保持連接打開(可能會有一段時間)? – user2653422

1

Altough它不會解決你所有的問題,特別是那些設計,你知道「包含」功能,預裝您工作的導航屬性? 例如,如果一個工作點,由於任務來命名屬性「任務」列表:

context.Jobs.Include(「任務」)//重新載入 作業的任務性質。

context.Jobs.Include(「Tasks.AllowedUsers」)//將預加載作業的任務 屬性以及每個任務的AllowedUsers列表。

如果你想在同一水平預裝幾個屬性,只是使用類似:

context.Jobs.Include( 「任務」),包括( 「OtherTasksOnJob」)

+0

我讀了關於這個功能。但是這需要從數據庫加載更多的數據,然後我需要在那個時候。但是,它解決了這個問題。但是,在關閉上下文後,我能夠使用receivedJobs集嗎? – user2653422

+0

您將能夠閱讀receivedJobs +所有包含的導航屬性。您需要重新打開更新連接。 – sthiers

相關問題