2012-11-27 23 views
1

所以我需要能夠編輯我的主鍵字段在我的編輯頁面爲一排,我得到的錯誤編輯標識 - 商店更新,插入或刪除語句受影響的行意想不到數(0)

存儲更新,插入或刪除語句 影響了意外的行數(0)。 實體被加載後,實體可能已被修改或刪除 。刷新ObjectStateManager條目。

當我不改變主鍵字段我能救我的所有其他的修改我的數據庫。

這是我的編輯功能。

//edit - post 
[HttpPost] 
public ActionResult ActiveCampaignsEdit(ActiveCampaign activecampaign) 
{ 
    try 
    { 
    if (ModelState.IsValid) 
    { 
     db.Entry(activecampaign).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("ActiveCampaigns"); 
    } 
    } 
    catch (DataException err) 
    { 
    //Log the error (add a variable name after DataException) 
    ModelState.AddModelError(string.Empty, err.Message); 
    } 
    ViewBag.TypesList = new SelectList(db.Types, "TypeId", "TypeName"); 
    ViewBag.CaptureFormsList = new SelectList(db.CaptureForms, "Id", "Name"); 
    ViewBag.AssignedUsersList = new SelectList(db.Users, "Id", "Username"); 
    return View(activecampaign); 
} 

我將如何去編輯主鍵,或者我以錯誤的方式接近這個?

+0

我不明白downvote。這個問題似乎對我有效和清晰。 –

+0

謝謝!也許它之前被問過?我花了過去一小時試圖找到一種方法來解決它(搜索本網站和谷歌),沒有運氣。 –

+1

你爲什麼要改變主鍵? EF使用主鍵來標識要更新的記錄。當您更改它時,將無法執行更新 – Jan

回答

3

當使用等實體框架的ORM,UPDATE命令基本上由這樣的:

UPDATE table 
SET ChangedCol = ChangedVal 
WHERE PrimaryKeyCol = PrimaryKeyValAtLoadTime 

然後它檢查受影響的行的數量以匹配預期值。

因此,當您嘗試更改PK時,更新命令將更新任何行,並且檢查將失敗。

真正的問題是:爲什麼要更改主鍵值?

1
public void Save(object entity) 
     { 
      using (var transaction = Connection.BeginTransaction()) 
      { 
      try 
        { 
         SaveChanges(); 
         transaction.Commit(); 
        } 
        catch (OptimisticConcurrencyException) 
        { 
         if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Deleted || ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Modified) 
          this.Refresh(RefreshMode.StoreWins, entity); 
         else if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Added) 
          Detach(entity); 
         AcceptAllChanges(); 
         transaction.Commit(); 
        } 
      } 
     } 
相關問題