1

我目前正在用Unity和Entity框架構建ASP.NET MVC應用程序。我使用Unity MVC 3安裝程序,它使用ContainerControlledLifetimeManager來解析依賴關係(http://devtrends.co.uk/blog/introducing-the-unity.mvc3-nuget-package-to-reconcile-mvc3-unity -and-IDisposable的)。這工作正常,直到我嘗試啓動另一個線程,在加載頁面後執行耗時的任務,並且用戶收到更新。從線程,我得到這個錯誤:使用Unity與ThreadPool進行Dbcontext的LIfetime管理

The operation cannot be completed because the DbContext has been disposed.

我相信這是因爲主線程完成這樣的集裝箱和它的孩子們得到處理。有誰知道這個解決方案嗎?

謝謝!

+0

你可以發佈你聲明和使用DbContext ..的代碼嗎? perhps你正在做一些使用(){} – MethodMan 2012-01-03 22:11:41

+1

你注入一個上下文嗎?代碼在這裏請:) – 2012-01-03 22:50:37

回答

0

往往不是,問題是,在你的控制器,你有這樣的代碼:

public ActionResult Blah() 
{ 
    MyViewModel model = new MyViewModel(); 

    using (var dbc = new MyDbContext()) 
    { 
    model.items = from x in dbc.items select x; 
    }  

    View(model) 
} 

items尚未在這種情況下解決,所以解決的辦法是:

model.items = (from x in dbc.items select x).ToList(); 
+0

OP明確解釋說他使用Unity進行依賴注入,所以不會有任何「new MyDbContext())」。 – keithl8041 2012-03-12 19:36:03

3

的標準上下文生命週期處理與控制器中的依賴注入無法在您的方案中工作,因爲您希望在其預期生命週期(控制器已發佈)之後使用注入的上下文。

耗費時間的操作必須引用另一個統一容器,並且必須要求使用Transient或PerResolve終身管理器解決的新上下文實例。當您的操作完成或中止時,它必須處理上下文處置。

恕我直言跨越ASP.NET(或任何IIS託管)應用程序中的自定義線程是不是很好的主意。