我的表中有两列名为CreatedOn
和ModifiedOn
的列。当然,在形式我不想显示这两个领域,即使在隐藏的领域。当我发布相同的表单时,我希望按当前日期时间更改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.
我该如何解决这个问题?
请不要给任何博客链接阅读,我已经阅读了其中一些但不能。
谢谢。
答案 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");
}
}