Как бороться с ошибкой параллелизма при обновлении IdentityUser? - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть способ обновить заявки пользователей в нашем приложении.

Я вошел в систему как пользователь-администратор, который может редактировать других пользователей.

Я пытаюсь удалить существующие заявки одного пользователяи назначить новые.

При удалении претензий с использованием UserManger я получаю ConcurrencyFailure в результате.(Иногда это работает, но большую часть времени возвращает ошибку ошибки.)

Код: «ConcurrencyFailure»

Описание: «Ошибка оптимистичного параллелизма, объект был изменен.»

Метод:

    public async Task<bool> AssignClaimsToUser(string id, List<string> newClaims)
    {
        bool success = false;

        ApplicationUser user = await _userManager.FindByIdAsync(id);
        List<Claim> userClaims = new List<Claim>();

        // Remove existing claims
        IList<Claim> existingClaims = await _userManager.GetClaimsAsync(user);
        var removal = await _userManager.RemoveClaimsAsync(user, existingClaims); // This fail

        if (removal.Succeeded)
        {
            success = true;

            // Add new claims
            foreach (string policy in newClaims)
            {
                userClaims.Add(new Claim(policy, string.Empty, ClaimValueTypes.String));
            }
            await _userManager.AddClaimsAsync(user, userClaims);
        }

        return success;
    }

Почему это происходит и что нужно сделать, чтобы решить эту проблему?

Эта проблема возникает только при удалении претензий.У меня его нет при вызове других методов на IdentityUser.

EDIT

Отладочный вывод:

enter image description here

Microsoft.AspNetCore.Hosting.Internal.WebHost: Информация: Запрос запуска HTTP / 1.1 POST http://localhost:47691/Users/ManageUsers_Update application / x-www-form-urlencoded;charset = UTF-8 246 Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware: Информация: HttpContext.User объединен с помощью AutomaticAuthentication от authenticationScheme: Identity.Application.Microsoft.AspNetCore.Authorization.DefaultAuthorizationService: Информация: Авторизация прошла успешно для пользователя: user@mydomain.com.Microsoft.AspNetCore.Authorization.DefaultAuthorizationService: Информация: Авторизация прошла успешно для пользователя: user@mydomain.com.Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Информация: выполнение метода действия MyProject.Controllers.UsersController.ManageUsers_Update (MyProject) с аргументами (Kendo.Mvc.UI.DataSourceRequest, MyProject.Views.ViewModels.Mlage.SystemMaseageSservers).EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: выполнено DbCommand (5 мс) [Параметры = [@__ id_0 = '?'(Размер = 450)], CommandType = 'Text', CommandTimeout = '30 '] SELECT TOP (1) [u]. [Id], [u]. [AccessFailedCount], [u]. [ConcurrencyStamp], [u]. [CustRef], [u]. [Email], [u]. [EmailConfirmed], [u]. [IsEnabled], [u]. [LockoutEnabled], [u]. [LockoutEnd], [u].[NormalizedEmail], [u]. [NormalizedUserName], [u]. [PasswordHash], [u]. [PhoneNumber], [u]. [PhoneNumberConfirmed], [u]. [SecurityStamp], [u]. [TwoFactorEnabled], [u]. [UserName] FROM [AspNetUsers] AS [u] ГДЕ [u]. [Id] = @__ id_0 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: выполнено DbCommand (5ms) [Параметры = [@]__custRef_0 = '?'(Размер = 10)], CommandType = 'Text', CommandTimeout = '30 '] SELECT TOP (1) [c]. [CustomerDetailsId], [c]. [CustRef], [c]. [CustomerDBConnectionString], [c]. [Включено], [c]. [Имя], [c]. [Пользовательские лицензии] ОТ [CustomerDetails] КАК [c] ГДЕ [c]. [CustRef] = @__ custRef_0 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory:Информация: Выполнено DbCommand (5 мс) [Параметры = [@__ custRef_0 = '?'(Размер = 10)], CommandType = 'Text', CommandTimeout = '30 '] SELECT [x]. [ID], [x]. [AspNetUserId], [x]. [CustRef], [x]. [CustomerId], [x]. [Email], [x]. [FirstName], [x]. [IsEnabled], [x]. [IsMaster], [x]. [ShowCosts], [x]. [Фамилия] ОТ[Пользователи] AS [x] WHERE [x]. [CustRef] = @__ custRef_0 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: выполнено DbCommand (5ms) [Parameters = [@__ users_Id_0 = '?'], CommandText ', CommandTimeout = '30'] SELECT TOP (1) [a]. [ID], [a]. [AspNetUserId], [a]. [CustRef], [a]. [CustomerId], [a].[Email], [a]. [FirstName], [a]. [IsEnabled], [a]. [IsMaster], [a]. [ShowCosts], [a]. [Фамилия] ОТ [Пользователи] КАК [a] WHERE [a]. [ID] = @__ users_Id_0 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: выполнено DbCommand (5 мс) [Parameters = [@__ id_0 = '?'(Размер = 450)], CommandType = 'Text', CommandTimeout = '30 '] SELECT TOP (1) [u]. [Id], [u]. [AccessFailedCount], [u]. [ConcurrencyStamp], [u]. [CustRef],[u]. [Электронная почта], [u]. [EmailConfirmed], [u]. [IsEnabled], [u]. [LockoutEnabled], [u]. [LockoutEnd], [u]. [NormalizedEmail], [u]]. [NormalizedUserName], [u]. [PasswordHash], [u]. [PhoneNumber], [u]. [PhoneNumberConfirmed], [u]. [SecurityStamp], [u]. [TwoFactorEnabled], [u].[UserName] FROM [AspNetUsers] AS [u] WHERE [u]. [Id] = @__ id_0 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: Выполнено DbCommand (5 мс) [Параметры = [@__ normalizedUserName_](Размер = 256)], CommandType = 'Text', CommandTimeout = '30 '] SELECT TOP (1) [u]. [Id], [u]. [AccessFailedCount], [u]. [ConcurrencyStamp], [u]. [CustRef], [u]. [Email], [u]. [EmailConfirmed], [u]. [IsEnabled], [u]. [LockoutEnabled], [u]. [LockoutEnd], [u].[NormalizedEmail], [u]. [NormalizedUserName], [u]. [PasswordHash], [u]. [PhoneNumber], [u]. [PhoneNumberConfirmed], [u]. [SecurityStamp], [u]. [TwoFactorEnabled], [и.p16 = '?'(Размер = 450), @ p0 = '?', @ P1 = '?'(Размер = 4000), @ p17 = '?'(Размер = 4000), @ p2 = '?'(Размер = 4000), @ p3 = '?'(Размер = 256), @ p4 = '?', @ P5 = '?', @ P6 = '?', @ P7 = '?', @ P8 = '?'(Размер = 256), @ p9 = '?'(Размер = 256), @ p10 = '?'(Размер = 4000), @ p11 = '?'(Размер = 4000), @ p12 = '?', @ P13 = '?'(Размер = 4000), @ p14 = '?', @ P15 = '?'(Размер = 256)], CommandType = 'Text', CommandTimeout = '30 '] SET NOCOUNT ON;ОБНОВЛЕНИЕ [AspNetUsers] SET [AccessFailedCount] = @ p0, [ConcurrencyStamp] = @ p1, [CustRef] = @ p2, [Email] = @ p3, [EmailConfirmed] = @ p4, [IsEnabled] = @ p5, [LockoutEnabled]= @ p6, [LockoutEnd] = @ p7, [NormalizedEmail] = @ p8, [NormalizedUserName] = @ p9, [PasswordHash] = @ p10, [PhoneNumber] = @ p11, [PhoneNumberConfirmed] = @ p12, [SecurityStamp] =@ p13, [TwoFactorEnabled] = @ p14, [UserName] = @ p15 WHERE [Id] = @ p16 AND [ConcurrencyStamp] = @ p17;ВЫБЕРИТЕ @@ ROWCOUNT;Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: выполнено DbCommand (5ms) [Параметры = [@__ menuId_0 = '?'], CommandType = 'Text', CommandTimeout = '30 '] SELECT [u]. [CustomerMenuI][и.= 'Text', CommandTimeout = '30 '] SELECT [m]. [Id], [m]. [AspNetPolicyId], [m]. [GlyphIcon], [m]. [Label], [m]. [MenuGroupId] FROM [MenuItem] AS [m] Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: выполнено DbCommand (5 мс) [Parameters = [], CommandType = 'Text', CommandTimeout = '30 '] SELECT [a]. [Id], [a]. [DefaultAction], [a]. [Описание], [a]. [Имя] FROM [AspNetPolicy] AS [a] Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: выполнено DbCommand (5 мс) [Параметры = [@__ id_0 = '?'(Размер = 450)], CommandType = 'Text', CommandTimeout = '30 '] SELECT TOP (1) [u]. [Id], [u]. [AccessFailedCount], [u]. [ConcurrencyStamp], [u]. [CustRef], [u]. [Email], [u]. [EmailConfirmed], [u]. [IsEnabled], [u]. [LockoutEnabled], [u]. [LockoutEnd], [u].[NormalizedEmail], [u]. [NormalizedUserName], [u]. [PasswordHash], [u]. [PhoneNumber], [u]. [PhoneNumberConfirmed], [u]. [SecurityStamp], [u]. [TwoFactorEnabled], [u]. [UserName] FROM [AspNetUsers] AS [u] ГДЕ [u]. [Id] = @__ id_0 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: выполнено DbCommand (5ms) [Параметры = [@]__user_Id_0 = '?'(Размер = 450)], CommandType = 'Text', CommandTimeout = '30 '] SELECT [uc]. [Id], [uc]. [ClaimType], [uc]. [ClaimValue], [uc]. [UserId] ОТ [AspNetUserClaims] КАК [uc] ГДЕ [uc]. [UserId] = @__ user_Id_0 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация:Выполнено DbCommand (9 мс) [Параметры = [@__ 8__locals1_user_Id_0 = '?'(Размер = 450), @__ Claudio_Value_1 = '?'(Размер = 4000), @__ Claudio_Type_2 = '?'(Размер = 4000)], CommandType = 'Text', CommandTimeout = '30 '] SELECT [uc]. [Id], [uc]. [ClaimType], [uc]. [ClaimValue], [uc]. [UserId] ОТ [AspNetUserClaims] КАК [uc] ГДЕ (([uc]. [UserId] = @__ 8__locals1_user_Id_0) И ([uc]. [ClaimValue] = @__ Applic_Value_1)) И ([uc]. [ClaimType] = @_ утверждений)Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: выполнено DbCommand (6 мс) [Parameters = [@__ 8__locals1_user_Id_0 = '?'(Размер = 450), @__ Claudio_Value_1 = '?'(Размер = 4000), @__ Claudio_Type_2 = '?'(Размер = 4000)], CommandType = 'Text', CommandTimeout = '30 '] SELECT [uc]. [Id], [uc]. [ClaimType], [uc]. [ClaimValue], [uc]. [UserId] ОТ [AspNetUserClaims] КАК [uc] ГДЕ (([uc]. [UserId] = @__ 8__locals1_user_Id_0) И ([uc]. [ClaimValue] = @__ Applic_Value_1)) И ([uc]. [ClaimType] = @_ утверждений)Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: выполнено DbCommand (93ms) [Parameters = [@__ 8__locals1_user_Id_0 = '?'(Размер = 450), @__ Claudio_Value_1 = '?'(Размер = 4000), @__ Claudio_Type_2 = '?'(Размер = 4000)], CommandType = 'Text', CommandTimeout = '30 '] SELECT [uc]. [Id], [uc]. [ClaimType], [uc]. [ClaimValue], [uc]. [UserId] ОТ [AspNetUserClaims] КАК [uc] ГДЕ (([uc]. [UserId] = @__ 8__locals1_user_Id_0) И ([uc]. [ClaimValue] = @__ Applic_Value_1)) И ([uc]. [ClaimType] = @_ утверждений)Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: выполнено DbCommand (5 мс) [Parameters = [@__ normalizedUserName_0 = '?'(Размер = 256)], CommandType = 'Text', CommandTimeout = '30 '] SELECT TOP (1) [u]. [Id], [u]. [AccessFailedCount], [u]. [ConcurrencyStamp], [u]. [CustRef], [u]. [Email], [u]. [EmailConfirmed], [u]. [IsEnabled], [u]. [LockoutEnabled], [u]. [LockoutEnd], [u].[NormalizedEmail], [u]. [NormalizedUserName], [u]. [PasswordHash], [u]. [PhoneNumber], [u]. [PhoneNumberConfirmed], [u]. [SecurityStamp], [u]. [TwoFactorEnabled], [u]. [UserName] FROM [AspNetUsers] AS [u] WHERE [u]. [NormalizedUserName] = @__ normalizedUserName_0 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: выполнено DbCommand (6ms)p0 = '?', @ p1 = '?', @ p2 = '?', @ p19 = '?'(Размер = 450), @ p3 = '?', @ P4 = '?'(Размер = 4000), @ p20 = '?'(Размер = 4000), @ p5 = '?'(Размер = 4000), @ p6 = '?'(Размер = 256), @ p7 = '?', @ P8 = '?', @ P9 = '?', @ P10 = '?', @ P11 = '?'(Размер = 256), @ p12 = '?'(Размер = 256), @ p13 = '?'(Размер = 4000), @ p14 = '?'(Размер = 4000), @ p15 = '?', @ P16 = '?'(Размер = 4000), @ p17 = '?', @ P18 = '?'(Размер = 256)], CommandType = 'Text', CommandTimeout = '30 '] SET NOCOUNT ON;УДАЛИТЬ ИЗ [AspNetUserClaims] ГДЕ [Id] = @ p0;ВЫБЕРИТЕ @@ ROWCOUNT;УДАЛИТЬ ИЗ [AspNetUserClaims] ГДЕ [Id] = @ p1;ВЫБЕРИТЕ @@ ROWCOUNT;УДАЛИТЬ ИЗ [AspNetUserClaims] ГДЕ [Id] = @ p2;ВЫБЕРИТЕ @@ ROWCOUNT;ОБНОВЛЕНИЕ [AspNetUsers] SET [AccessFailedCount] = @ p3, [ConcurrencyStamp] = @ p4, [CustRef] = @ p5, [Email] = @ p6, [EmailConfirmed] = @ p7, [IsEnabled] = @ p8, [LockoutEnabled]= @ p9, [LockoutEnd] = @ p10, [NormalizedEmail] = @ p11, [NormalizedUserName] = @ p12, [PasswordHash] = @ p13, [PhoneNumber] = @ p14, [PhoneNumberConfirmed] = @ p15, [SecurityStamp] =@ p16, [TwoFactorEnabled] = @ p17, [UserName] = @ p18 WHERE [Id] = @ p19 AND [ConcurrencyStamp] = @ p20;ВЫБЕРИТЕ @@ ROWCOUNT;'dotnet.exe' (CoreCLR: clrhost): загружен 'C: \ Users \ jsmith.nuget \ packages \ system.diagnostics.stacktrace \ 4.3.0 \ lib \ netstandard1.3 \ System.Diagnostics.StackTrace.dll'.Пропущены символы загрузки.Модуль оптимизирован и включена опция отладчика «Просто мой код».Microsoft.EntityFrameworkCore.DbContext: Ошибка: в базе данных произошла исключительная ситуация при сохранении изменений.Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: ожидается, что операция с базой данных повлияет на 1 строку (и), но фактически затронула 0 строк.Данные могут быть изменены или удалены, так как объекты были загружены.См. http://go.microsoft.com/fwlink/?LinkId=527962 для получения информации о понимании и обработке исключений оптимистичного параллелизма.в Microsoft.EntityFrameworkCore.Update.ActedCountModificationCommandBatch.ThrowAggregateUpdateConcurrencyException (Int32 commandIndex, Int32 ОжидаемыйRowsActed, Int32 rowAActed) в Microsoft.EntityFrameworkCore.Update.ActedCountMoveNoveNove_Texception_name- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в Майкрософт.EntityFrameworkCore.Uc.из предыдущего местоположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в Microsoft.EntityFraode.() --- Конец стека трассировки от предыдущегоРасположение, в которое было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в Microsoft.EntityFradateIn.MoveNext () --- Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи в Microsoft).EntityFrameworkCore.ChangeTracking.Internal.StateManager.d__47.MoveNext () --- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.d__45.MoveNext () --- Трассировка конца стека fиз предыдущего местоположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в Microsoft.EntityFraxt.Mext.Mext.Mext.Mext.Mext.Mext.Mext.Rec.MeCore.Core.CoreMoreCore.

Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: ожидается, что операция с базой данных затронет 1 строку, но фактически затронет 0 строк.Данные могут быть изменены или удалены, так как объекты были загружены.См. http://go.microsoft.com/fwlink/?LinkId=527962 для получения информации о понимании и обработке исключений оптимистичного параллелизма.в Microsoft.EntityFrameworkCore.Update.ActedCountModificationCommandBatch.ThrowAggregateUpdateConcurrencyException (Int32 commandIndex, Int32 ОжидаемыйRowsActed, Int32 rowAActed) в Microsoft.EntityFrameworkCore.Update.ActedCountMoveNoveNove_Texception_name- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в Майкрософт.EntityFrameworkCore.Uc.из предыдущего местоположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в Microsoft.EntityFraode.()--- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в Microsoft.EntoreFra.Update.Internal.BatchExecutor.d__1.MoveNext () --- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task task) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.d__47.MoveNext () --- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaS.Задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.d__45.MoveNext () --- Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи в Microsoft).EntityFrameworkCore.DbContext.d__30.MoveNext () Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: выполнено DbCommand (6ms) [Parameters = [@ p0 = '?', @ P1 = '?' @ P2 = '?' @ P2 = '?' @ P2', @ p19 ='? '(Размер = 450), @ p3 = '?', @ P4 = '?'(Размер = 4000), @ p20 = '?'(Размер = 4000), @ p5 = '?'(Размер = 4000), @ p6 = '?'(Размер = 256), @ p7 = '?', @ P8 = '?', @ P9 = '?', @ P10 = '?', @ P11 = '?'(Размер = 256), @ p12 = '?'(Размер = 256), @ p13 = '?'(Размер = 4000), @ p14 = '?'(Размер = 4000), @ p15 = '?', @ P16 = '?'(Размер = 4000), @ p17 = '?', @ P18 = '?'(Размер = 256)], CommandType = 'Text', CommandTimeout = '30 '] SET NOCOUNT ON;УДАЛИТЬ ИЗ [AspNetUserClaims] ГДЕ [Id] = @ p0;ВЫБЕРИТЕ @@ ROWCOUNT;УДАЛИТЬ ИЗ [AspNetUserClaims] ГДЕ [Id] = @ p1;ВЫБЕРИТЕ @@ ROWCOUNT;УДАЛИТЬ ИЗ [AspNetUserClaims] ГДЕ [Id] = @ p2;ВЫБЕРИТЕ @@ ROWCOUNT;ОБНОВЛЕНИЕ [AspNetUsers] SET [AccessFailedCount] = @ p3, [ConcurrencyStamp] = @ p4, [CustRef] = @ p5, [Email] = @ p6, [EmailConfirmed] = @ p7, [IsEnabled] = @ p8, [LockoutEnabled]= @ p9, [LockoutEnd] = @ p10, [NormalizedEmail] = @ p11, [NormalizedUserName] = @ p12, [PasswordHash] = @ p13, [PhoneNumber] = @ p14, [PhoneNumberConfirmed] = @ p15, [SecurityStamp] =@ p16, [TwoFactorEnabled] = @ p17, [UserName] = @ p18 WHERE [Id] = @ p19 AND [ConcurrencyStamp] = @ p20;ВЫБЕРИТЕ @@ ROWCOUNT;Microsoft.EntityFrameworkCore.DbContext: Ошибка: в базе данных произошла исключительная ситуация при сохранении изменений.Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: ожидается, что операция с базой данных повлияет на 1 строку (и), но фактически затронула 0 строк.Данные могут быть изменены или удалены, так как объекты были загружены.См. http://go.microsoft.com/fwlink/?LinkId=527962 для получения информации о понимании и обработке исключений оптимистичного параллелизма.на Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ThrowAggregateUpdateConcurrencyException (Int32 commandIndex, Int32, Int32 expectedRowsAffected rowsAffected) в Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ConsumeResultSetWithoutPropagation (Int32 commandIndex, DbDataReader читателя) в Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.Consume (DbDataReader читателя) в Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute (соединение IRelationalConnection) в Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute (IEnumerable 1 commandBatches, IRelationalConnection connection) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList 1 entryToSave.hangeChangeChangeChanE) в Microsoft.EntityFrameworkCore.DbContext.SaveChanges (Boolean acceptAllChangesOnSuccess)

Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: ожидается, что операция с базой данных затронет 1 строку, но фактически затронет 0 строк.Данные могут быть изменены или удалены, так как объекты были загружены.См. http://go.microsoft.com/fwlink/?LinkId=527962 для получения информации о понимании и обработке исключений оптимистичного параллелизма.на Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ThrowAggregateUpdateConcurrencyException (Int32 commandIndex, Int32, Int32 expectedRowsAffected rowsAffected) в Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ConsumeResultSetWithoutPropagation (Int32 commandIndex, DbDataReader читателя) в Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.Consume (DbDataReader читателя) в Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute (соединение IRelationalConnection) в Майкрософт) в Microsoft.EntityFrameworkCore.DbContext.SaveChanges (Boolean acceptAllChangesOnSuccess) Возникло исключение: «Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException» в Microsoft.EntityFrameworkCore.dll Поток0x6264 вышел с кодом 0 (0x0).Нить 0xaa0 вышла с кодом 0 (0x0).Нить 0x6a84 вышла с кодом 0 (0x0).

ManageUsers_Update:

    public async  Task<ActionResult> ManageUsers_Update([DataSourceRequest] DataSourceRequest request, ManageUsersViewModel viewModel)
    {
        if (viewModel != null && ModelState.IsValid)
        {
            User objToUpdate = new User
            {
                Id = viewModel.ID,
                FirstName = viewModel.FirstName,
                Surname = viewModel.Surname
            };
            _userRepository.UpdateUser(objToUpdate);

            if (viewModel.CustomerMenuId != null && viewModel.CustomerMenuId > 0)
            {
                int customerMenuId = Convert.ToInt32(viewModel.CustomerMenuId);

                // Update user's claims
                List<string> newClaims = _navigationRepository.GetPolicyNamesByCustomerMenuId(customerMenuId);
                bool claimsUpdated = await _applicationUserService.AssignClaimsToUser(viewModel.AspNetUserId, newClaims);

                // Assign user to menu if updating claims succeeded
                if (claimsUpdated)
                {
                    _navigationRepository.AssignCustomerMenuToUser(new CustomerMenuUser()
                        {CustomerMenuId = customerMenuId, AspNetUserId = viewModel.AspNetUserId});
                }
            }

            ApplicationUser user = await _userManager.FindByIdAsync(viewModel.AspNetUserId);
            user.IsEnabled = viewModel.IsEnabled;
            await _userManager.UpdateAsync(user);
        }

        return Json(new[] { viewModel }.ToDataSourceResult(request, ModelState));
    }

1 Ответ

0 голосов
/ 28 сентября 2018

Почему это происходит?

Наиболее вероятная причина из-за конфликта параллелизма, который означает, что несколько пользователей (потоков) попытались изменить одни и те же данные.

Здесь вы можете найти более подробную информацию о том, как это происходит

https://docs.microsoft.com/en-us/ef/core/saving/concurrency

Что делать, чтобы решить эту проблему?

Я предполагаю, что в вашем случае несколько пользователей не должны обновлять одни и те же утверждения, поэтому может существовать дублирование запросов.

Вы можете попробовать:

  • проверить, обновляются ли данные вБД.В случае нескольких запросов один из них должен сохранить изменения;
  • проверьте вкладку «Сеть» в своем браузере при публикации запроса или установите точку останова и посмотрите, сколько раз оно было выполнено за один запрос;
  • изолирует дефектный код от приложения и пытается воспроизвести эту проблему.

Другой подход (обычно, когда разрешен множественный доступ) - реализовать политику повторных попыток для повторного выполнения логики обновления в случаеоптимистического провала.Я уверен, что это не подходит для вашего случая, но это сработает, если вам нужно быстрое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...