重新加载绑定实体导致“ObjectStateManager中已存在具有相同键的对象”

时间:2012-11-26 20:49:38

标签: asp.net-mvc entity-framework

以前曾经问过,但是没有一个可用的答案似乎适合我的情况。 为了执行某些验证,我必须从DB重新加载已绑定到模型的同一实体。以下原因导致错误。我几乎要失去理智了。

[HttpPost]
public ActionResult Edit(Tekes tekes, FormCollection fc)
{
  ...
  Tekes myTekes = db.Tkasim.Find(tekes.TeksID);
  <some validation here>
  if (ModelState.IsValid)
  {
     db.Entry(tekes).State = EntityState.Modified;
     db.SaveChanges();
     return RedirectToAction("Details", new { id = tekes.TekesID });
  }
}

1 个答案:

答案 0 :(得分:0)

不确定为什么必须从数据库中获取相同的实体。无论如何,问题是Find语句将Tekes对象添加到上下文中,随后语句db.Entry(tekes).State = EntityState.Modified尝试执行相同操作。目前还不清楚验证的内容是什么,但我认为您可以通过将Find替换为

来解决这个问题。
var myTekes = db.Tkasim.AsNoTracking().Single(x => x.TeksId == tekes.TeksID);

AsNoTracking告诉EF获取实体而不将它们添加到缓存和状态管理器。