2015-07-21 21 views
1

我有一個表單,用戶可以編輯其用戶帳戶信息,然後保存新的更改。保存對用戶帳戶的更改導致DbUpdateConcurrencyException

當我將修改後的更改保存到數據庫時,我遇到了問題。

上線context.SaveChanges(),我得到一個DbUpdateConcurrencyException異常拋出。它說,"Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

我不知道爲什麼

這裏是我做了什麼:

public ActionResult EditUserAccount() 
{ 
    UserAccountViewModel editUserAccountViewModel = new UserAccountViewModel(); 
    editUserAccountViewModel.UserName = UserSession.GetValue(StateNameEnum.UserName, StateNameEnum.UserName.ToString()) as string; 
    int UserId = WebSecurity.GetUserId(editUserAccountViewModel.UserName); 
    var userInfo = context.db_user.First(x => x.UserId == UserId); 

    editUserAccountViewModel.Title = userInfo.Title; 
    editUserAccountViewModel.FirstName = userInfo.FirstName; 
    editUserAccountViewModel.LastName = userInfo.LastName; 
    editUserAccountViewModel.PhoneNumber = userInfo.PhoneNumber; 
    editUserAccountViewModel.AltPhoneNumber = userInfo.AltPhoneNumber; 
    editUserAccountViewModel.EmailAddress = userInfo.EmailAddress; 
    editUserAccountViewModel.UserAccountState = UserAccountViewModel.AccountState.EDIT; 
    return (PartialView("~/Views/Account/UserAccount.cshtml", editUserAccountViewModel)); 

} 

[HttpPost] 
public ActionResult EditUserAccount_Save(UserAccountViewModel editUserAccountViewModel) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      editUserAccountViewModel.UserName = UserSession.GetValue(StateNameEnum.UserName, StateNameEnum.UserName.ToString()) as string; 

      db_user user = new db_user(); 
      user.Title = editUserAccountViewModel.Title; 
      user.FirstName = editUserAccountViewModel.FirstName; 
      user.LastName = editUserAccountViewModel.LastName; 
      user.PhoneNumber = editUserAccountViewModel.PhoneNumber; 
      user.AltPhoneNumber = editUserAccountViewModel.AltPhoneNumber; 
      user.EmailAddress = editUserAccountViewModel.EmailAddress; 
      user.LanguageId = context.languages.Where(t => t.Code == editUserAccountViewModel.Language).Select(t => t.Id).SingleOrDefault(); 
      user.CreatedDate = DateTime.Now; 
      user.UserId = WebSecurity.GetUserId(editUserAccountViewModel.UserName); 

      context.Entry(user).State = EntityState.Modified; 
      context.SaveChanges(); 

      JsonResult res = Json(new { Success = true, data = "", Message = "" }); 
      return res; 
     } 
     else 
     { 
      JsonResult res2 = Json(new { Success = false, data = "", Message = "" }); 
      return res2; 
     } 
    } 
    return null; 
} 

回答

3

你是不是在控制器動作中創建的context一個實例,這將意味着它這意味着context與該控制器處理的每個其他Web請求共享,這部分錯誤消息Entities may have been modified or deleted since entities were loaded似乎證實了該假設。而是在您的控制器操作中創建context的實例。

由於您正在編輯此操作中的現有用戶,因此首先需要將現有用戶從數據庫加載到context,而不是像現在這樣實例化新用戶。

我強烈懷疑此更改將解決您的問題。

UPDATE

下面是一個代碼示例。我不知道你的上下文類是什麼,所以你可能不得不改變那部分。我假定當調用這個控制器時(基於方法的名稱),用戶必須已經存在。我刪除了try,因爲你沒有捕捉任何東西。如果有用,你可以做的時候拋出一個異常的東西,繼續前進,擺在那了。

[HttpPost] 
public ActionResult EditUserAccount_Save(UserAccountViewModel editUserAccountViewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     using (MyContext context = new MyContext()) 
     { 
      int userId = WebSecurity.GetUserId(editUserAccountViewModel.UserName); 
      db_user user = context.DbUsers.Where(u => u.Id == userId).Single(); 
      editUserAccountViewModel.UserName = UserSession.GetValue(StateNameEnum.UserName, StateNameEnum.UserName.ToString()) as string; 

      user.Title = editUserAccountViewModel.Title; 
      user.FirstName = editUserAccountViewModel.FirstName; 
      user.LastName = editUserAccountViewModel.LastName; 
      user.PhoneNumber = editUserAccountViewModel.PhoneNumber; 
      user.AltPhoneNumber = editUserAccountViewModel.AltPhoneNumber; 
      user.EmailAddress = editUserAccountViewModel.EmailAddress; 
      user.LanguageId = context.languages.Where(t => t.Code == editUserAccountViewModel.Language).Select(t => t.Id).SingleOrDefault(); 
      user.CreatedDate = DateTime.Now; 

      context.SaveChanges(); 

      JsonResult res = Json(new { Success = true, data = "", Message = "" }); 
      return res; 
     } 
    } 
    else 
    { 
     JsonResult res2 = Json(new { Success = false, data = "", Message = "" }); 
     return res2; 
    } 
} 
+0

啊好吧,那麼1)實例化控制器動作中的背景和2)「現有用戶加載到上下文「這是什麼意思? –

+0

添加了一個示例。 –

+0

好吧,謝謝你,順便說一句,我得到了加載用戶到上下文的錯誤:不能隱式地將類型'System.Linq.IQueryable '轉換爲'Models.db_user'。存在明確的轉換(您是否缺少演員?) –