想要在asp .net mvc 3中更新表行

时间:2012-07-16 07:57:50

标签: c# asp.net-mvc-3 entity-framework-4.1

我的表中有两列名为CreatedOnModifiedOn的列。当然,在形式我不想显示这两个领域,即使在隐藏的领域。当我发布相同的表单时,我希望按当前日期时间更改ModifiedOn,并希望保持CreatedOn值不变。但由于我没有隐藏的文件名CreatedOn,因此它在数据库中将其设置为null。所以我然后使用下面的代码

public ActionResult Edit(User user)
{ 
            if (ModelState.IsValid)
            {

                var OldInsObj = db.Users.Find(user.UserId);
                DateTime UsersDateCreated = (DateTime)db.Entry(OldInsObj).Property("UsersDateCreated").CurrentValue;

                user.UsersDateCreated = UsersDateCreated;

                user.UsersDateModified = DateTime.Now;

                db.Entry(user).State = EntityState.Modified;

                db.SaveChanges();
                return RedirectToAction("Index");
                }
}

我收到此错误

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.

我该如何解决这个问题?

请不要给任何博客链接阅读,我已经阅读了其中一些但不能。

谢谢。

1 个答案:

答案 0 :(得分:3)

有几种方法可以解决此问题。您可以在附加新实例之前分离旧对象

public ActionResult Edit(User user)
{ 
        if (ModelState.IsValid)
        {
            var OldInsObj = db.Users.Find(user.UserId);
            DateTime UsersDateCreated = OldInsObj.UsersDateCreated;

            user.UsersDateCreated = UsersDateCreated;
            user.UsersDateModified = DateTime.Now;

            db.Entry(OldInsObj).State = EntityState.Detached;

            db.Entry(user).State = EntityState.Modified;

            db.SaveChanges();
            return RedirectToAction("Index");
        }
 }

您可以更新从数据库中检索的实体实例。

public ActionResult Edit(int userId)
{ 
        var user = db.Users.Find(userId);

        if (TryUpdateModel(user))
        {                
            user.UsersDateCreated = UsersDateCreated;

            user.UsersDateModified = DateTime.Now;

            db.SaveChanges();
            return RedirectToAction("Index");
        }
 }

或者您可以使用Automapper将user实例的值复制到OldInsObj实例。

public ActionResult Edit(User user)
{ 
        if (ModelState.IsValid)
        {
            var OldInsObj = db.Users.Find(user.UserId);
            DateTime UsersDateCreated = OldInsObj.UsersDateCreated;

            OldInsObj = Mapper.Map(user);

            OldInsObj.UsersDateCreated = UsersDateCreated;
            OldInsObj.UsersDateModified = DateTime.Now;

            db.SaveChanges();
            return RedirectToAction("Index");
        }
 }