0

您好我正在尝试使用 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() 方法每次都失败。

多谢你们!

4

1 回答 1

3

您看到的异常是因为您有一个开放的数据读取器 (foreach),并且您正在尝试在 SaveChanges() 中创建事务(EF 为您完成)。在循环外调用 SaveChanges。另外:不要将状态设置为已修改 - EF 将检测到属性已更改并相应地自动设置状态。在做任何事情之前,您可能想在 q 上执行 .ToList() 。目前,您正在向数据库发送查询(一个用于 .Any(),一个用于获取实体)。如果你这样做 .ToList() 你将只发送一个带实体的查询,但 .Any() 将在列表上而不是在数据库上调用,因此它会更快,并且不会访问数据库。ToList() 还强制查询评估,因此您的 foreach 循环不会使数据读取器保持打开状态,因为它将在列表上进行迭代。

于 2012-05-04T21:12:25.730 回答