2013-07-17 81 views
0

我有以下看法: -DbUpdateException將保存在數據庫中的數據後提出

@using (Ajax.BeginForm("AssignUsers", "SecurityGroup", 
new AjaxOptions 
{ HttpMethod = "POST", 
    InsertionMode = InsertionMode.Replace, 
    UpdateTargetId = "UsersAssignment" 
})) 
{ 
    @Html.HiddenFor(Model => Model.GroupID) 
    @Html.AntiForgeryToken() 
<span>Search</span>  <input name="selectedUserNames" type="text" data-val="true" data-val-required= "Please enter a value." data-autocomplete-source= "@Url.Action("AutoComplete", "SecurityGroup")" /> 
<span class="field-validation-valid" data-valmsg-for="selectedUserNames" data-valmsg-replace="true"></span> 

<input type="submit" value="Assign" /> 
} 

和下面的動作方法: -

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult AssignUsers(int GroupID, string[] selectedUserNames, string[] currentUserNames) 
     { 
      try 
      { 
       if (ModelState.IsValid) 
       { repository.AssignUserGroup(GroupID, selectedUserNames, currentUserNames); 
        repository.Save(); 
        if (!Request.IsAjaxRequest()) 
        { 
         return RedirectToAction("Details", new { id = GroupID }); 
        } 
        else if (Request.IsAjaxRequest()) 
        { 
         var ADUsers = repository.GetADUsers(); 
         var group = repository.FindAllGroup(GroupID); 
         ViewBag.Users = repository.populateAssignedUsersData(group, ADUsers); 
         return PartialView("_Group", group); 
        } 
       } 
      } 
      catch (DbUpdateException) 
      { 
       ModelState.AddModelError(string.Empty, "Error occured. User might already assinged."); 
       var ADUsers = repository.GetADUsers(); 
       var group = repository.FindAllGroup(GroupID); 
       ViewBag.Users = repository.populateAssignedUsersData(group, ADUsers); 
       return PartialView("_Group", group); 
      } 
      return null; 
     } 

最後版本庫模式: -

public void AssignUserGroup(int id, string[] selectedUsers, string[] currentusernames) 
     { 
      var usergroups = tms.UserGroups.Where(a=>a.GroupID == id); 
      foreach (var ug in usergroups) 
      { 
       if (currentusernames != null) 
       { 
        for (int c = 0; c < currentusernames.Count(); c++) 
        { 
         if (ug.UserName.ToUpper() == currentusernames[c].ToUpper()) 
         { 
          tms.UserGroups.Remove(ug); 
         } 
        } 
       } 
      } 
      if(selectedUsers !=null) 
      { 
       for (int i = 0; i < selectedUsers.Count(); i++) 
       { 
        UserGroup usergroup = new UserGroup(); 
        usergroup.GroupID = id; 
        usergroup.UserName = selectedUsers[i]; 
        tms.UserGroups.Add(usergroup); 
       } 
      } 
     } 

但奇怪的是,當用戶點擊Ajax.Begin表單來分配一個新用戶時,用戶將被添加到數據庫中,但同時會引發DBUpdateException,並出現「發生錯誤。 。用戶可能已經分配」的ModelState錯誤將持續顯示這是完全錯誤的描述: -

System.Data.Entity.Infrastructure.DbUpdateException被抓獲
的HResult = -2146233087消息=更新時出現錯誤。在 條目詳見內部異常源=的EntityFramework 堆棧跟蹤: 在System.Data.Entity.Internal.InternalContext.SaveChanges() 在System.Data.Entity.Internal.LazyInternalContext.SaveChanges() 在系統.Data.Entity.DbContext.SaveChanges() at c:\ Users \ Administrator \ Documents \ Visual S中的TMS.Models.Repository.Save() tudio 2012 \ Projects \ TMS \ TMS \ Models \ Repository.cs:line 60 at TMS.Controllers.SecurityGroupController.AssignUsers(Int32 GroupID,String [] selectedUserNames,String [] currentUserNames)in c:\ Users \ Administrator \ Documents \ Visual Studio 2012 \ Projects \ TMS \ TMS \ Controllers \ SecurityGroupController.cs:98行
InnerException:System.Data.UpdateException HResult = -2146233087 Message =更新條目時發生錯誤。詳情請參閱內部例外。 源= System.Data.Entity的 堆棧跟蹤: 在System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter適配器) 在System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache) 在System.Data.Objects.ObjectContext.SaveChanges(SaveOptions選項) 在System.Data.Entity.Internal.InternalContext.SaveChanges() 的InnerException信息:System.Data.SqlClient.SqlException 的HResult = -2146232060 消息的違反= PRIMARY KEY約束'PK_UserGroup'。不能在對象 'dbo.UserGroups'中插入重複密鑰。重複鍵值是(44,testuser)。 聲明已被終止。 源= .net SqlClient數據提供 錯誤碼= -2146232060 類= 「14」 LineNumber上= 1 總數= 2627 過程= 「」 服務器= WIN-SPDEV 狀態= 1 堆棧跟蹤: 在System.Data .SqlClient.SqlConnection.OnError(SqlException異常, 布爾breakConnection,動作1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction) 在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布爾callerHasConnectionLock,布爾asyncClose) 在System.Data.SqlClient.TdsParser 。TryRun(RunBehavior runBehavior,SqlCommand的cmdHandler,SqlDataReader的數據流, BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,布爾& dataReady) 在System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader的DS, RunBehavior runBehavior,字符串resetOptionsString) 在System.Data .SqlClient.SqlCommand.RunExecuteReaderTds(的CommandBehavior cmdBehavior,runBehavior runBehavior,布爾returnStream,布爾 異步,的Int32超時,任務&任務,布爾asyncWrite) 在System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior cmdBehavior,runBehavior runBehavior,布爾returnStream,字符串 方法,TaskCompletionSource 完成,字符串方法名,布爾sendToPipe,的Int32超時, 布爾asyncWrite) 在System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 在System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute (UpdateTranslator 翻譯,EntityConnection連接,字典2 identifierValues, List 1個generatedValues) 在System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter適配器) 的InnerException:

不限請告訴我的代碼有什麼問題?

回答

0

任何意見請問我的代碼有什麼問題?

你的例外明確規定:

違反PRIMARY KEY約束 'PK_UserGroup' 的。無法在對象'dbo.UserGroups'中插入重複鍵。重複鍵值是(44,testuser)。

因爲我不知道你的PK_UserGroup是什麼,任何人都可以說的是,你不應該被插入重複主鍵值到表dbo.UserGroups

你的兩個選擇是要麼;檢查是否存在具有重複密鑰的記錄並進行錯誤處理,或者(不推薦)捕獲PK_UserGroup的數據庫異常並執行錯誤處理。

+0

但是如何在我的代碼裏面同時發生DBupdateException,但同時記錄被添加到數據庫!!!! –

+0

和我做了服務器,數據庫等的完全重啓。並知道我無法再次重現錯誤。這完全不合邏輯。恐怕實體框架和數據庫之間的整合不能很好地發揮作用。 –