操作无法完成,因为DbContext已被处置

问题描述:

我正在EF 4.1中编写一个简单的应用程序,它将使用我的公共数据源(数据库的*服务器)的添加,删除,编辑和详细信息。 在我的控制器类我写:操作无法完成,因为DbContext已被处置

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> 

的错误是这样的: “操作不能因为DbContext已经被处理完毕。“

+7

你需要返回db.Registrant.ToList(),因为它试图在datacontext被处理后执行查询,ToList()将强制更早执行它。 – Giedrius 2012-08-08 07:14:10

你应该用一个列表来传递的模型

我认为db.Registrant返回用户的列表?如果是的话做这样的事情

List<Registrant> items = null; 

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

return View(items); 
+0

这一次,它给items = db.Registrant.ToList();该“ ”执行命令定义时发生错误。 “ – 2012-08-08 07:24:07

+0

我改变了代码,你是否试过这种方式? – JohnnBlade 2012-08-08 07:26:59

+3

为什么'从你...选择你而不仅仅是'db.Registrant.ToList()' – sloth 2012-08-08 07:40:20

只是作进一步评论,你需要分开你的顾虑。你不应该像控制器那样使用数据库上下文。而是通过存储库或服务层使用它。

我在使用using时也遇到了这个问题。我删除了使用部分。修改下面的代码以适应您的方案。假设你要带回用户列表。我会这在我的仓库类:

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

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

你就必须在你的控制器通过Autofac,Ninject注入该库等

在你的控制器会是这个样子:

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() 
      }; 
    } 
} 

然后在您的视图中,您可以循环访问用户。

+4

可能是因为这对于实际问题来说是多余的,它可能不应该是真的被低估了,但同时也不应该出于同样的原因进行投票。需要遵守SoC,特别是如果它非常简单 – 2013-07-02 12:27:34