我有以下看法: -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:
不限請告訴我的代碼有什麼問題?
但是如何在我的代碼裏面同時發生DBupdateException,但同時記錄被添加到數據庫!!!! –
和我做了服務器,數據庫等的完全重啓。並知道我無法再次重現錯誤。這完全不合邏輯。恐怕實體框架和數據庫之間的整合不能很好地發揮作用。 –