您好我正在尝试使用Linq和实体框架基于id进行基本更新。我对此很新,但我没有看到问题。
我的实体类对象在控制器级别声明。
gwwbnEntities db = new gwwbnEntities();
该方法获取查询字符串ID并更新由该ID表示的用户注册状态。
public ActionResult ConfirmedAccount(int id)
{
var q = from u in db.user_registration
where u.id == id && u.reg_status == null
select u;
if (q.Any())
{
foreach(var item in q){
user_registration user = item;
user.reg_status = 202;
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
}
return View();
}
else
{
return RedirectToAction("RegistrationError");
}
}
任何帮助将不胜感激!同样,一切都正常工作和填充,但上下文object.SaveChanges()方法每次都失败。
谢谢你们!
答案 0 :(得分:3)
您看到的异常是因为您有一个开放数据阅读器(foreach),并且您正尝试在SaveChanges()中创建事务(EF为您执行此操作)。在循环外调用SaveChanges。 另外:不要将状态设置为Modified - EF将检测属性是否已更改,并将相应地自动设置状态。在执行任何操作之前,您可能希望在q上执行.ToList()。此时您正在向数据库发送查询(一个用于.Any(),一个用于获取实体)。如果你执行.ToList(),你只会发送一个带来实体的查询但是.Any()会在列表上调用而不是在数据库上调用,所以它会更快,并且没有数据库的访问。此外,ToList()强制进行查询评估,因此foreach循环不会保持数据读取器处于打开状态,因为它将在列表上进行迭代。