操作无法完成,因为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已经被处理完毕。“
你应该用一个列表来传递的模型
我认为db.Registrant返回用户的列表?如果是的话做这样的事情
List<Registrant> items = null;
using (var db = new RegModelContext(CmdStr))
{
items = db.Registrant.ToList();
}
return View(items);
这一次,它给items = db.Registrant.ToList();该“ ”执行命令定义时发生错误。 “ – 2012-08-08 07:24:07
我改变了代码,你是否试过这种方式? – JohnnBlade 2012-08-08 07:26:59
为什么'从你...选择你而不仅仅是'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()
};
}
}
然后在您的视图中,您可以循环访问用户。
可能是因为这对于实际问题来说是多余的,它可能不应该是真的被低估了,但同时也不应该出于同样的原因进行投票。需要遵守SoC,特别是如果它非常简单 – 2013-07-02 12:27:34
你需要返回db.Registrant.ToList(),因为它试图在datacontext被处理后执行查询,ToList()将强制更早执行它。 – Giedrius 2012-08-08 07:14:10