我有以下Asp.Net MVC 4脚手架代码。
//
// POST: /Detail/Edit/5
[HttpPost]
public ActionResult Edit(Detail detail)
{
var dd = Details.FirstOrDefault(d => d.DetailId == detail.DetailId);
if (dd == null)
{
return HttpNotFound();
}
detail.UpdatedBy = User.Identity.Name;
detail.UpdateTime = DateTime.Now;
if (ModelState.IsValid)
{
_db.Entry(detail).State = EntityState.Modified;
_db.SaveChanges();
return RedirectToAction("Index", new { id = detail.MasterId });
}
return View(dealDetail);
}
但是,行_db.Entry(detail).State = EntityState.Modified;
会引发以下错误。更新主/细节编辑场景细节线的正确方法是什么?
ObjectStateManager中已存在具有相同键的对象。 ObjectStateManager无法使用相同的键跟踪多个对象。
答案 0 :(得分:3)
这一行:
var dd = Details.FirstOrDefault(d => d.DetailId == detail.DetailId);
将导致从数据库加载Detail实体。现在,您有两个具有相同Id的详细信息,但只有一个(该查询加载的一个)可用于持久性。您可以将代码更改为:
if (!Details.Any(d => d.DetailId == detail.DetailId))
{
return HttpNotFound();
}
或更新附加的详细信息(dd
),例如:
// All values of detail entity must be set in your HTTP post!
_db.Entry(dd).CurrentValues.SetValues(detail);