实体框架LINQ插入命令失败。 MVC3

时间:2012-05-04 19:27:34

标签: asp.net-mvc-3 linq entity-framework

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

谢谢你们!

1 个答案:

答案 0 :(得分:3)

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