由于已经处理了DbContext,因此无法完成操作

时间:2013-04-05 16:55:09

标签: c# mysql asp.net-mvc

这个问题已经被多次询问了,但我仍然不明白为什么我会一直收到这个错误。

在我的控制器中,我有这种方法:

//
// POST : /ObjectProducer/Edit/5
[HttpPost]
public ActionResult Edit(OBJECT_PRODUCER _objProd)
{
    if (ModelState.IsValid)
    {
        m_Db.Entry(_objProd).State = EntityState.Modified;
        m_Db.SaveChanges();
        return RedirectToAction("SearchIndex");
    }

    return View(_objProd);
}

但是当我点击m_Db.Entry(_objProd).State = EntityState.Modified;行时,会发生错误。任何人都可以向我解释什么是错的吗?

**编辑**

这是启动“编辑”方法的控制器方法(“GET”方法)

//
// GET : /PriceProvider/Edit
public ActionResult Edit(int id = 0)
{
    OBJECT_PRODUCER objProd = m_ProductManager.GetObjProdByID(id);

    if (objProd == null)
    {
        ViewData["ErrorMessage"] = m_NoDataFound;
    }

    return View(objProd);
}

2 个答案:

答案 0 :(得分:3)

我认为你需要遵循几个步骤来解决你的问题:

  1. 在用户提交时,您需要从用户正在编辑的dbContext中获取实体。
  2. 然后根据用户提交的实体从dbContext更新实体上的值。
  3. 我正在使用Entity Framework 5,这是我用来根据用户提交的更新实体更新原始实体的代码:

    public virtual void Update(TEntity entityToUpdate, TEntity originalEntity)
        {
            ctx.Entry(originalEntity).CurrentValues.SetValues(entityToUpdate);
        }
    

    所以我认为在你的情况下:

    public ActionResult Edit(OBJECT_PRODUCER _objProd)
    {
        if (ModelState.IsValid)
        {
            //this line might not be quite right, but basically 
            //get the entity from dbContext based on the id of the submitted object
            OBJECT_PRODUCER originalFromDbContext = m_Db.GetById(_objProd.Id);
    
            //set the values for the Entity retrieved from m_Db to the new values
            //submitted by the user
            m_Db.Entry(originalFromDbContext).CurrentValues.SetValues(_objProd);
    
            m_Db.SaveChanges(); //save changes
            return RedirectToAction("SearchIndex");
        }
        return View(_objProd);
    }
    

答案 1 :(得分:1)

尝试从m_Db重新获取_objProd实体。你在帖子中得到的那个实际上并不是你当前的datacontext的一部分,它来自于获取版本的Edit中使用的datacontext。

var _newObjProd = m_Db.GetObjProdByID(_objProd.ID);

基本上,实体在两个DataContexts中的效果不佳。您需要在新的datacontext中再次加载实体。