将状态更改为EntityState.Modified引发的错误

时间:2013-03-26 06:43:12

标签: asp.net asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5

我有以下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无法使用相同的键跟踪多个对象。

1 个答案:

答案 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);