1

我的表中有 2 列名为CreatedOnand ModifiedOn。当然,在表单中我不想显示这两个字段,即使在隐藏字段中也是如此。当我发布相同的表格时,我想ModifiedOn通过 Current DateTime 更改并希望保持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.

我该如何解决这个问题?

请不要提供任何博客链接以供阅读,我已经阅读了其中一些但无法阅读。

谢谢你。

4

1 回答 1

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 将实例的值复制userOldInsObj实例。

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");
        }
 }
于 2012-07-16T08:24:18.550 回答