欢迎光临

木子屋

标题: ASP.NET MVC3更新出错：ObjectStateManager中已存在具有同一键的对象

作者: dnawo

日期: 2013-05-08 10:11 AM

分类: Web编程

内容: 复制内容到剪贴板 程序代码[HttpPost]
public ActionResult Edit(Person person)
{
if (ModelState.IsValid)
{
Person oldperson = db.People.Where(p => p.Id == person.Id).FirstOrDefault();
//TODO
db.Entry(person).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(person);
}
上边代码试图在更新person到数据库前取出旧数据(oldperson)进行文件删除等操作，结果页面报错：
引用内容ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。
若是不取旧数据，该段代码执行可以正常执行，经过一番测试，猜测原因是读取旧数据时，对象会被添加到db中，当执行"db.Entry(person)"时，试图把person也添加到db中，但person和先前添加对象的键值是一样的，因而报错，这也解释了为什么不取旧数据不出错。
下边提供三种解决方法：
复制内容到剪贴板 程序代码Person oldperson = db.People.Where(p => p.Id == person.Id).FirstOrDefault();
//TODO
oldperson.PicUrl = person.PicUrl;
db.SaveChanges();
复制内容到剪贴板 程序代码Person oldperson = db.People.AsNoTracking().Where(p => p.Id == person.Id).FirstOrDefault();
//TODO
db.Entry(person).State = EntityState.Modified;
db.SaveChanges();
复制内容到剪贴板 程序代码Person oldperson = db.People.Where(p => p.Id == person.Id).FirstOrDefault();
//TODO
db.Entry(oldperson).CurrentValues.SetValues(person);
db.SaveChanges();
参考资料
[1].An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key

+ 查看当前日志评论 (0)

登录

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.789 ms

返回

标题: ASP.NET MVC3更新出错：ObjectStateManager中已存在具有同一键的对象

你没有权限发表评论

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.789 ms

返回

暂无评论

返回

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.820 ms

返回