2016-04-11 36 views
1

我的帖子編輯操作這次打擊代碼:)包含此代碼錯誤更新實體框架的DbModel之後

public ActionResult EditProduct(EditProductModel viewModel,HttpPostedFileBase file) 
    { 
     if (Session["AdminId"] != null && Session["AdminName"] != null) 
     { 
      repository = new Repository(); 
      var pro = repository.FindProductById(viewModel.Id); 

      // Automappper configoration. 
      var config = new MapperConfiguration(cgf => cgf.CreateMap<EditProductModel, Product>()); 
      var mapper = config.CreateMapper(); 
      pro = mapper.Map<Product>(viewModel); 

      repository.UpdateProduct(pro);// Error 
      repository.SaveChanges(); 

      return RedirectToAction("ShowProduct",new{id = AdminId}); 
     } 
     return RedirectToAction("AdminLogin"); 
    } 

的repository.UpdateProduct(:

public void UpdateProduct(Product obj) 
    { 

     entities.Entry(obj).State = EntityState.Modified; 
    } 

但這頂部代碼拋出這個錯誤:

附加一個'MobileShop.Models.Product'類型的實體失敗,因爲另一個相同類型的實體已經有相同的prim ary鍵值。如果圖中的任何實體具有衝突的鍵值,則使用「附加」方法或將實體的狀態設置爲「未更改」或「已修改」時可能會發生這種情況。這可能是因爲一些實體是新的並且還沒有收到數據庫生成的關鍵值。在這種情況下,使用'Add'方法或'Added'實體狀態來跟蹤圖形,然後根據情況將非新實體的狀態設置爲'Unchanged'或'Modified'。

我該如何解決它?

回答

0

添加此行的更新和保存:

using (var Context = new MobileDatabase_1_Entities()) 
    { 
    Context.Entry(pro).State = EntityState.Modified; 
    Context.SaveChanges(); 
    } 
1

您的pro對象已經從上下文加載,並且由EF跟蹤。在更新方法中將其狀態更改爲已修改是多餘的,因此會發生此錯誤。

那麼你可以跳過代碼在你Update方法改變狀態,

或註釋掉以下行,因爲你反正從viewModel

repository = new Repository(); 
var pro = repository.FindProductById(viewModel.Id); 

構建實體作爲一個規則;如果一個對象已經從上下文加載,請不要附加它 如果它已經在上下文之外創建,請將其狀態設置爲已修改。

很好看 - https://msdn.microsoft.com/en-us/data/jj592676.aspx

+0

那麼怎麼辦? –

+0

@komeilshahmoradi - 您可以註釋掉上面的行。接下來構建你的'pro'實體(你已經這樣做了),確保它具有與視圖模型中相同的'Id'。保持'Update'方法不變。這應該工作 – Yogi

+0

它不工作 –