C# 无法完成该操作,因为DbContext已被释放

C# 无法完成该操作,因为DbContext已被释放,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我正在EF4.1中编写一个简单的应用程序,它将使用添加、删除、编辑和详细信息形成我的公共数据源(数据库中央服务器)。 在我的控制器类中,我写: public class RegController : Controller { // // GET: /Reg/ private string CmdStr = ConfigurationManager.ConnectionStrings["MyConn"].ConnectionStri

我正在EF4.1中编写一个简单的应用程序,它将使用添加、删除、编辑和详细信息形成我的公共数据源(数据库中央服务器)。 在我的控制器类中,我写:

    public class RegController : Controller
    {
       //
       // GET: /Reg/
       private string CmdStr =    ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString;      
       public ActionResult Index()
      {
        using (var db = new RegModelContext(CmdStr))
        {
          return View(db.Registrant);
       }

    }
}
执行应用程序时,foreach语句的索引视图中出现错误:

@model IEnumerable<Registration.Models.Register>

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <title>Index</title>
</head>
<body>
    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    <table>
        <tr>
            <th></th>
            <th>
                UserName
            </th>
            <th>
                Password
            </th>
            <th>
                Email
            </th>
            <th>
                Address
            </th>
        </tr>

    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
                @Html.ActionLink("Details", "Details", new { id=item.Id }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.Id })
            </td>
            <td>
                @item.UserName
            </td>
            <td>
                @item.Password
            </td>
            <td>
                @item.Email
            </td>
            <td>
                @item.Address
            </td>
        </tr>
    }

    </table>
</body>
</html>
@model IEnumerable
@{
布局=空;
}
指数

@ActionLink(“新建”、“创建”)

用户名 密码 电子邮件 地址 @foreach(模型中的var项目){ @ActionLink(“编辑”,“编辑”,新的{id=item.id})| @ActionLink(“详细信息”,“详细信息”,新的{id=item.id})| @ActionLink(“删除”,“删除”,新的{id=item.id}) @item.UserName @项目。密码 @邮件 @项目.地址 }
错误是:
“操作无法完成,因为DbContext已被释放。”

您应该使用列表作为模型传递

我假设db.Registrant返回一个用户列表?,如果是这样的话,请执行以下操作

List<Registrant> items = null;

using (var db = new RegModelContext(CmdStr))
{
    items = db.Registrant.ToList();
}

return View(items);
列表项=null;
使用(var db=new RegModelContext(CmdStr))
{
items=db.Registrant.ToList();
}
返回视图(项目);

为了进一步说明,您需要分离您的关注点。您不应该在控制器中这样使用数据库上下文。而是通过存储库或服务层使用它

我在使用
时也遇到了这个问题。我移除了正在使用的部件。修改下面的代码以适合您的场景。假设您要带回一个用户列表。我将在我的存储库类中包含以下内容:

public class UserRepository : IUserRepository
{
     MyDbContext dbContext = new MyDbContext();

     public IEnumerable<User> GetAll()
     {
          return dbContext.Users;
     }
}

然后在您的视图中,您可以通过用户进行循环。

您需要返回db.Registrant.ToList(),因为它在释放datacontext后尝试执行查询,所以ToList()将强制更快地执行它。这次它在items=db.Registrant.ToList()上给出了一个错误;执行命令定义时出错。有关详细信息,请参阅内部异常。“为什么从u中选择u,而不仅仅是
db.registant.ToList()
@FahadMahmood什么是内部例外?可能是因为它对实际问题来说是多余的。它可能不应该真的被否决,但同时也不应该因为同样的原因被否决。不是每个项目都需要遵守SoC,特别是如果它非常简单的话
public class UserController : Controller
{
     private readonly IUserRepository userRepository;

     public UserController(IUserRepository userRepository)
     {
          this.userRepository = userRepository;
     }

     public ActionResult Index()
     {
          UserViewModel viewModel = new UserViewModel
          {
               Users = userRepository.GetAll()
          };
     }
}