2012-02-03 62 views
2

我想知道如何在下列情況下正確處理對象。這是一個ASP.NET MVC控制器操作。有一個實現IDisposable的倉庫。附件實體包含相關的實體任務。當我點擊附件詳細信息時,它顯示正確。但是當我點擊這個任務時,下面的異常拋出:「ObjectContext實例已經被處置...」。我明白,當視圖呈現時,它被放置並且ObjectContext被關閉。如何正確處理對象(ASP.NET MVC +實體框架)

public ActionResult Detail(Guid id) 
{ 
    Attachment attachment = null; 
    using (var attachmentRepository = IoC.Resolve<AttachmentRepository>()) 
    { 
     attachment = attachmentRepository.SelectByKey(id); 
     return View("Detail", attachment);    
    }   
}  

我的問題是什麼是最好的做法在這種情況下?

這是一個很好的解決方案嗎?什麼時候將ObjectContext置於這種情況下?當用戶轉到另一個視圖?或者當垃圾收集器將被執行?

public ActionResult Detail(Guid id) 
{ 
    Attachment attachment = null; 
    var attachmentRepository = IoC.Resolve<AttachmentRepository>(); 

    attachment = attachmentRepository.SelectByKey(id); 
    return View("Detail", attachment);        
}  

感謝

回答

2

Task實體並沒有恢復成原始查詢的一部分,所以EF試圖延遲加載它,因爲上下文已被釋放其失敗。您應該使用Include()查詢來檢索Task實體作爲原始查詢的一部分,以避免稍後再回到數據庫(這也意味着您必須保持該上下文保持活動狀態)。

此外,您還沒有真正在做IoC,您正在使用Service locator (Anti-) pattern。您應該將IoC容器作爲構造函數依賴項傳遞到您的存儲庫中。 IoC容器反過來應該負責存儲庫實例的生命週期管理。

+1

由於__BrokenGlass__說你應該使用'Include'來加載實體,我猜想一個ViewModel會更好地將你的數據傳遞給View。這裏有一些很好的理由說明爲什麼你不應該在視圖中延遲加載你的數據:http://nhprof.com/learn/alerts/QueriesFromViews – Andreas 2012-02-03 15:51:37