2013-04-05 89 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

相關問題