2012-12-29 76 views
0

我有mvc3應用程序,我首先使用EF 5代碼進行數據訪問 我確實收到以下錯誤消息,但我不明白爲什麼。處理EF對象

任何人都可以解釋爲什麼是這樣的,我怎麼能再次避免這個問題?

ObjectContext實例已被處置,不能再用於需要連接的操作。

我的數據訪問代碼:

var list = new List<Task>(); 

using (var db = new SiteContext()) 
{ 
    var queryableAll = db.Tasks.AsQueryable(); 

    // setup order descending 
    queryableAll = (orderByTimeDescending) 
      ? queryableAll.OrderByDescending(x => x.Created) 
      : queryableAll.OrderBy(x => x.Created); 

    list.AddRange(queryableAll 
     .Include("Customer") 
     .Include("Collection").ToList()); 

} 
return list; 

我的觀點:

@foreach (var task in Model.Tasks.OrderByDescending(x => x.Created)) 
{ 
    Html.RenderPartial("_ProjectLine", task); 
} 

我的部分_ProjectLine

@model ProjectManagement.DataAccess.Models.Task 
<tr> 
    <td>@Model.TaskId</td> 
    <td> 
     @Html.ActionLink(Model.Name, "ManageTask", "Task", new { id = Model.TaskId }, null) 
    </td> 
    <td> 
     @Model.Collection.Name 
    </td> 
    <td>@Model.Customer.Name</td> 
</tr> 

更新:

我得到的異常時,日e局部視圖正在渲染。 我知道如果我刪除使用,並將其留給垃圾收集器處理,它的工作原理。但我不喜歡這個解決方案。

+0

發生異常的地方在哪裏? – usr

+0

@usr:我已更新問題並回答了您的問題 – cpoDesign

+1

看起來您在部分視圖中有問題。可能它正在訪問任務 –

回答

2

您正在處理頁面呈現之前的上下文。如果你做任何事情需要一個活躍的上下文(例如,引用一個懶惰加載的屬性,但還有很多其他的例子 - 查看例外中的調用堆棧,看看爲你設置了什麼),那麼你會看到這個錯誤。

避免這種情況的常用方法是配置您的DI容器以圍繞HTTP請求範圍內的生存期,然後使用構造函數注入將上下文傳遞給您的方法,而不是顯式實例化/將其置於使用塊中。

請參閱Mark Seeman的書.NET中的依賴注入的示例。

0

我同意克雷格有關問題的原因。確保這些問題不會發生的一個好方法是創建一個單獨的,簡單的POCO視圖模型類,其中只包含視圖所需的信息。然後,您可以將其填充到控制器中(也會給您一個鉤子以驗證它已正確填充),然後您可以將它傳遞給查看。如果您的視圖模型類不會對EF類有任何依賴性,則不需要SiteContext。