0

我有 mvc3 应用程序,我首先使用 EF 5 代码进行数据访问,我确实收到以下错误消息,但我不明白为什么。

谁能解释为什么会这样,我怎样才能再次避免这个问题?

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>

更新:

渲染局部视图时出现异常。我知道如果我删除 using 并将其留给垃圾收集器处理,它可以工作。但我不喜欢这个解决方案。

4

2 回答 2

2

您在页面呈现之前处理您的上下文。如果您随后执行任何需要活动上下文的操作(例如,引用延迟加载的属性,但还有许多其他示例 - 查看异常中的调用堆栈以了解为您设置它的原因),那么您将看到这个错误。

避免这种情况的常用方法是配置您的 DI 容器以围绕 HTTP 请求限定上下文生存期,然后使用构造函数注入将上下文传递给您的方法,而不是在 using 块中显式实例化/处置它。

有关示例,请参见 Mark Seeman 的.NET 中的依赖注入一书。

于 2012-12-29T21:24:28.233 回答
0

我同意克雷格关于问题原因的看法。确保这些问题不会发生的一个好方法是创建一个单独的、简单的 POCO 视图模型类,该类仅包含视图所需的信息。然后你可以在控制器中填充它(这也给你一个钩子来验证它是否被正确填充)然后你可以将它传递给查看。如果您的视图模型类对 EF 类没有任何依赖关系,则仍然需要 SiteContext 没有风险。

于 2012-12-30T19:02:10.833 回答