EF对象处理完毕

时间:2012-12-29 20:27:49

标签: entity-framework entity-framework-5

我有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>

更新

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

2 个答案:

答案 0 :(得分:2)

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

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

有关示例,请参阅Mark Seeman的书籍 .NET中的依赖注入

答案 1 :(得分:0)

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