0

私は次の見解を持っています:-

@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 が発生し、「エラーが発生しました。ユーザーはすでに割り当てられています。」モデル状態エラーが表示されます。これは完全なエラーの説明です:-

System.Data.Entity.Infrastructure.DbUpdateException がキャッチされました
HResult=-2146233087 Message=エントリの更新中にエラーが発生しました。詳細については、内部例外を参照してください。Source=EntityFramework StackTrace: System.Data.Entity.Internal.InternalContext.SaveChanges() で System.Data.Entity.Internal.LazyInternalContext.SaveChanges() で System.Data.Entity.DbContext.SaveChanges() で TMS.Models. c:\Users\Administrator\Documents\Visual Studio 2012\Projects\TMS\TMS\Models\Repository.cs: TMS.Controllers.SecurityGroupController.AssignUsers(Int32 GroupID, String[] selectedUserNames, c:\Users\Administrator\Documents\Visual Studio 2012\Projects\TMS\TMS\Controllers\SecurityGroupController.cs:line 98 の String[] currentUserNames)
InnerException: System.Data.UpdateException HResult=-2146233087 Message=エントリの更新中にエラーが発生しました。詳細については、内部例外を参照してください。ソース = System.Data.Entity StackTrace: System.Data.Mapping.Update.Internal.UpdateTranslator.Update (IEntityStateManager stateManager、IEntityAdapter アダプター) で System.Data.EntityClient.EntityAdapter.Update (IEntityStateManager entityCache) で System.Data.Objects System.Data.Entity.Internal.InternalContext.SaveChanges() の .ObjectContext.SaveChanges(SaveOptions オプション) InnerException: System.Data.SqlClient.SqlException HResult=-2146232060 メッセージ = PRIMARY KEY 制約 'PK_UserGroup' の違反。オブジェクト 'dbo に重複するキーを挿入できません。ユーザーグループ」。重複キーの値は (44, testuser) です。ステートメントは終了されました。Source=.Net SqlClient Data Provider ErrorCode=-2146232060 class="14" LineNumber=1 Number=2627 Procedure="" Server=WIN-SPDEV State=1 StackTrace: at System.Data.SqlClient.SqlConnection.OnError(SqlException exception,ブール型の breakConnection、アクション1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) で System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) で System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task 、Boolean asyncWrite) System.Data.SqlClient.SqlCommand で。RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource1 completion, Int32 timeout, Task& task, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource2 identifierValues, ListSystem.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator トランスレータ、EntityConnection 接続、ディクショナリ1での System.Data.SqlClient.SqlCommand.ExecuteNonQuery() での 1 つの完了、文字列の methodName、ブール値の sendToPipe、Int32 タイムアウト、ブール値の asyncWrite) generatedValues) System.Data.Mapping.Update.Internal.UpdateTranslator.Update (IEntityStateManager stateManager、IEntityAdapter アダプター) で InnerException:

私のコードの何が問題なのかアドバイスをお願いします。

4

1 に答える 1

0

私のコードの何が問題なのかアドバイスをお願いします。

あなたの例外は明確に述べています:

PRIMARY KEY 制約 'PK_UserGroup' に違反しています。オブジェクト 'dbo.UserGroups' に重複するキーを挿入できません。重複キーの値は (44, testuser) です。

私はあなたが何であるかわからないのでPK_UserGroup、誰もが言うことができるのは、テーブルに重複した主キーdbo.UserGroupsの値を挿入するべきではないということだけです。

あなたの2つのオプションはどちらかです。重複キーを持つレコードが存在するかどうかを確認してエラー処理を行うか、(推奨されません) DB 例外をキャッチしPK_UserGroupてエラー処理を行います。

于 2013-07-17T00:30:58.387 に答える