2013-04-05 46 views
0

此问题已被多次询问,但我仍不明白为什么我一直收到此错误。该操作无法完成,因为已经配置了DbContext

在我的控制器我有这样的方法:

// 
// 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); 
} 
+0

其中或这是什么'OBJECT_PRODUCER _objProd',为什么你现在使用下面的代码变量..什么是'_objProd' – MethodMan 2013-04-05 16:57:29

+0

你也可能要张贴的控制器代码的其余部分。我想我知道什么是错的,但我需要看到更多的代码才能确定。 – IronMan84 2013-04-05 16:59:28

+0

OBJECT_PRODUCER是从数据库创建的类,_objProd是用户单击“提交”按钮后从视图返回的对象,目的是获取此对象并将修改保存在数据库中。 – hsim 2013-04-05 16:59:47

回答

3

我认为你需要遵循几个步骤,这应该解决您的问题:

  1. 来自于用户提交,您需要从的DbContext得到实体用户编辑。
  2. 然后根据用户提交的实体从dbContext更新实体上的值。

我使用实体框架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); 
} 
+0

我会试试看,并告诉你它是否有效。 – hsim 2013-04-05 18:25:01

+0

嘿!这样可行!谢谢:) – hsim 2013-04-05 18:49:13

+0

这让我明白了人们所说的所有评论。 – hsim 2013-04-05 18:52:37

1

尝试重新获取从m_Db的_objProd实体控制器方法。您在文章中获得的内容实际上并不是您当前datacontext的一部分,它来自Edit版本的Edit中使用的datacontext。

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

基本上,实体在两个DataContexts之间播放效果并不好。您需要在新的数据上下文中再次加载实体。

+0

好吧,没错,但是当我拥有它时,我需要做什么?我试图改变字段并重做m_Db.Entry行,但结果是一样的... – hsim 2013-04-05 17:11:24

+0

只需使用_objProd中的任何更改更新_newObjProd中的字段,然后调用SaveChanges()。无需更改EntityState。 – 2013-04-05 17:38:08

相关问题