我有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>
更新
部分视图渲染时出现异常。 我知道如果我删除使用并将其留给垃圾收集器处理,它的工作原理。但我不喜欢这个解决方案。
答案 0 :(得分:2)
您在页面呈现之前处理上下文。如果您随后执行任何需要活动上下文的操作(例如,引用一个延迟加载的属性,但还有许多其他示例 - 查看异常中的调用堆栈以查看为您设置的内容),那么您将看到这个错误。
避免这种情况的常用方法是配置DI容器以围绕HTTP请求确定上下文生存期,然后使用构造函数注入将上下文传递给方法,而不是在using块中显式实例化/处理它。
有关示例,请参阅Mark Seeman的书籍 .NET中的依赖注入。
答案 1 :(得分:0)
我同意克雷格关于这个问题的原因。确保不会发生这些问题的好方法是创建一个单独的,简单的POCO视图模型类,其中仅包含视图所需的信息。然后你可以在控制器中填充它(这也给你一个钩子来验证它是否正确填充)然后你可以将它传递给视图。如果您的视图模型类不依赖于EF类,则不存在仍然需要SiteContext的风险。