在ASP中获得错误.MVC视图中,ObjectContext实例已被处理,不能再用于需要连接的操作

本文关键字:处理 不能 用于 操作 连接 实例 ASP 错误 MVC ObjectContext 视图 | 更新日期: 2023-09-27 17:49:27

控制器代码:

public ActionResult Edit(int id)
{
    Users result = null;
    using (MyApplicationContext context = new MyApplicationContext())
    {
        ViewBag.Conditions = context.Conditions.Where(x => x.IsActive).OrderBy(x => x.Name).ToList();
        result = context.Users.FirstOrDefault(x => x.Id == id);
    }
        return View("Manage", result);
}

在视图中,Manage。在cshtml中,我有以下代码:

@using MyApplicationContext.Models
@model MyApplication.Models.Users
@{
    ViewBag.Title = "Manage";
    List<MyApplication.Models.Condition> conditionList = ViewBag.Conditions;
    foreach (var condition in conditions)
    {
        bool isChecked = Model.Conditions.Any(x => x.Id == condition.Id) ? true : false;
    }

代码在foreach循环中对isChecked赋值失败,但在编辑器中,模型描述是'获取关联的viewdatadiictionary对象的Model属性。

我不明白这是如何与ObjectContext对象绑定的。当我删除它时,引用model的代码(来自@model的小写字母)就成功了。

谢谢你,

在ASP中获得错误.MVC视图中,ObjectContext实例已被处理,不能再用于需要连接的操作

核心原因是User。Conditions是一个延迟加载的导航,并且您的数据上下文(和底层连接)已经在视图中关闭。

解决这个问题的快速方法是确保条件被用户加载。

// Include this namespace:
using System.Data.Entity;

然后修改结果查询:

result = context.Users
    .Include(u => u.Conditions) // <-- Instruct the query to also load Conditions.
    .FirstOrDefault(x => x.Id == id);

你已经传入了一个类型为'Users'的模型,我假设它有一个名为Conditions的导航属性。导航属性将查询数据库。

看起来你想写conditionList.Any(x => x.Id == condition.Id) ? true : false;代替Model。条件,就像你已经列出的条件列表一样。(使用ToList()将在该点查询数据库,从而避免此问题)

如果你确实需要导航属性,你也可以考虑像result.Conditions.ToList()那样将其扁平化,并使用它来代替Model。条件属性。