Как справиться с ошибкой параллелизма при обновлении IdentityUser?

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

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

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

При удалении претензий с использованием 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.

ИЗМЕНИТЬ

Вывод отладки:

введите здесь описание изображения

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 (IEnumerable1 commandBatches, IRelationalConnection connection) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList1 entriesToSave) в Microsoft.EntityChangeChangesChanges (Microsoft.EntityChangeChangeSave) 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));
    }

person nickornotto    schedule 28.09.2018    source источник
comment
Несколько пользователей не могут попытаться обновить одну и ту же запись, поскольку я единственный пользователь, использующий / работающий над ней. Обычно первое изменение оказывается успешным, следующие попытки терпят неудачу даже после того, как я выхожу из системы и снова вхожу в систему. 1. При успешном удалении претензии обновляются правильно, как и предполагалось. 2. Запрос делается только один раз. @ Иван   -  person Ivan Zaruba    schedule 28.09.2018
comment
@nickornotto было бы здорово, если бы вы поделились репо с кодом для воспроизведения проблемы   -  person nickornotto    schedule 28.09.2018


Ответы (3)


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

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

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

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

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

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

проверьте, обновлены ли данные в БД. В случае нескольких запросов один из них должен сохранить изменения;

  • изолировать дефектный код от приложения и попытаться воспроизвести эту проблему.
  • В моем случае решение было простым: у меня были продукты, категории и категории продуктов, когда я удалил категорию перед продуктами (которые также удаляют данные из категорий продуктов), я получил ошибку, как и вы. Проблема заключалась в том, что он пытался удалить отношение, которое не могло существовать, потому что категории уже были удалены.
  • В моем случае я получаю ту же ошибку при использовании _1_ Я отправлял ролевую модель для метода обновления, а затем это дало мне ошибку, и я подумал, что получаю эту ошибку из-за процесса получения данных, которые я выполнял для загрузки данные на экране (FindByIdAsync для получения претензий и другие)

проверьте вкладку «Сеть» в своем браузере при отправке запроса или установите точку останова и посмотрите, сколько раз она была достигнута во время одного запроса;

person Ivan Zaruba    schedule 28.09.2018
comment
При необходимости я могу поделиться дополнительной информацией, но не могу поделиться проектом. Он также включает в себя базу данных и большой - person nickornotto; 28.09.2018
comment
Не могли бы вы предоставить результаты отладки? - person Ivan Zaruba; 28.09.2018
comment
добавлен вывод отладки в сообщение - person nickornotto; 28.09.2018
comment
Это не совсем то, что я ожидал. Под выводом отладки я подразумеваю текст из окна вывода (обычно открывается с помощью Ctrl + Alt + O) и выбранный вывод Показать вывод из: Отладка. Это показывает, как обрабатывается ответ и какие запросы делаются в БД. - person Ivan Zaruba; 28.09.2018
comment
Добавлен вывод @Ivan - person nickornotto; 01.10.2018
comment
Можно ли увидеть действие ManageUsers_Update, чтобы увидеть, что происходит до вызова AssignClaimsToUser? - person Ivan Zaruba; 01.10.2018
comment
Ничего особенного, ничего не связанного с _1_ @Ivan, см. Выше - person nickornotto; 01.10.2018
comment
Я попытался использовать уловку из статьи MS, на которую вы ссылались, но не смог решить основную проблему: удаление существующих претензий, но это не помогло. Фрагмент catch обрабатывает свойства только _1_, что является _2_, что является правильным и не требует обновления. Меняется просто штамп параллелизма. - person Ivan Zaruba; 01.10.2018
comment
Невозможно воспроизвести проблему. Единственный способ поймать эту проблему для меня - это отправить два запроса одновременно. В этом случае причина очевидна в выводе отладки. В твоем случае это не так. Не уверен, что смогу помочь, если вы не предоставили код для его воспроизведения. Может быть, вы могли бы переименовать все и изолировать это единственное действие. В любом случае, если нет, вы можете попробовать обновить версии пакетов EF Core. Также попробуйте имитировать предыдущие вызовы, которые используют ApplicationUser - закомментируйте _2_ и замените _3_ постоянным значением, чтобы убедиться, что эти вызовы не влияют - person nickornotto; 01.10.2018
comment
EntityEntry - это просто список строк - и он заполняется из другой таблицы, не связанной с ApplicationUser - нет причин, по которым это может повлиять на _3_. _4_ также использует другую настраиваемую таблицу пользователей. Я жестко запрограммировал значения вместо извлечения из таблицы, удалил весь код, который не нужен для обновления утверждений, и это не дало положительного эффекта - проблема все еще сохраняется. Я думаю, что сначала напишу специальный sproc, чтобы удалить претензии из _5_ и посмотреть, решит ли это проблему. - person nickornotto; 01.10.2018
comment
Мне удалось обновить штамп параллелизма и повторно запустить удаление заявок в цикле перехвата, и теперь он работает каждый раз. - person Ivan Zaruba; 01.10.2018
comment
@nickornotto приятно это слышать - person nickornotto; 04.10.2018
comment
Есть ли ссылки на подход с повторением и повторным запуском для обработки оптимистичного параллелизма в блоке _1_? - person nickornotto; 04.10.2018
comment
@Kok How Teh это просто попытка / уловка с тем же вызовом метода в предложении catch. Однако имейте в виду, что правильным способом было бы синхронизировать доступ либо на уровне кода, либо на уровне БД (что позволяет более детальные блокировки) или изменить режим параллелизма на пезимистический. Повторная попытка оптимистичной неудачи - это обходной путь, а не лучшая практика. - person Ivan Zaruba; 04.10.2018
comment
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: Информация: Авторизация прошла успешно для пользователя: [email protected]. Microsoft.AspNetCore.Authorization.DefaultAuthorizationService: Информация: Авторизация прошла успешно для пользователя: [email protected]. Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Информация: выполнение метода действия MyProject.Controllers.UsersController.ManageUsers_Update (MyProject) с аргументами (Kendo.Mvc.UI.DataSourceRequest, MyProject.Views.ViewModels.ManageUsers) - EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: Выполненная команда DbCommand (5 мс) [Parameters = [@__ id_0 = '?' (Размер = 450)], CommandType = 'Text', CommandTimeout = '30 '] ВЫБРАТЬ 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 мс) [Parameters = [@ __custRef_0 = '?' (Размер = 10)], CommandType = 'Text', CommandTimeout = '30 '] ВЫБРАТЬ TOP (1) [c]. [CustomerDetailsId], [c]. [CustRef], [c]. [CustomerDBConnectionString], [c ]. [Включено], [c]. [Имя], [c]. [UserLicenses] FROM [CustomerDetails] AS [c] WHERE [c]. [CustRef] = @__ custRef_0 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: Выполненная команда DbCommand (5 мс) [Parameters = [@__ custRef_0 = '?' (Размер = 10)], CommandType = 'Text', CommandTimeout = '30 '] SELECT [x]. [ID], [x]. [AspNetUserId], [x]. [CustRef], [x]. [CustomerId] ], [x]. [Электронная почта], [x]. [Имя], [x]. [IsEnabled], [x]. [IsMaster], [x]. [ShowCosts], [x]. [Фамилия] ОТ [Пользователи] AS [x] WHERE [x]. [CustRef] = @__ custRef_0 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: Выполненная команда DbCommand (5 мс) [Параметры = [@__ users_Id_0 = '?'], CommandType = 'Text', CommandTimeout = '30 '] 1) [a]. [ID], [a]. [AspNetUserId], [a]. [CustRef], [a]. [CustomerId], [a]. [Email], [a]. [FirstName], [a]. [IsEnabled], [a]. [IsMaster], [a]. [ShowCosts], [a]. [Фамилия] ОТ [Пользователи] AS [a] WHERE [a]. [ID] = @__ users_Id_0 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: Выполненная команда DbCommand (5 мс) [Parameters = [@__ id_0 = '?' (Размер = 450)], CommandType = 'Text', CommandTimeout = '30 '] ВЫБРАТЬ 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 мс) [Parameters = [@ __normalizedUserName_0 = '?' (Размер = 256)], CommandType = 'Text', CommandTimeout = '30 '] ВЫБРАТЬ 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]. [NormalizedUserName] = @__ normalizedUserName_0 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: Выполненные параметры DbCommand (6ms) [Parameters 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 = '?' (Size = 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 (5 мс) [Параметры = [@__ menuId_0 = '?'], CommandType = 'Text', CommandTimeout = '30 '] SELECT [u]. [CustomerMenuId], [u ]. [MenuItemId] ОТ [CustomerMenuItem] AS [u] ГДЕ [u]. [CustomerMenuId] = @__ menuId_0 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: Выполненная команда DbCommand (5 мс) [Parameters = [] Text ', CommandTimeout = '30'] ВЫБРАТЬ [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 мс) [ Para метры = [@__ id_0 = '?' (Размер = 450)], CommandType = 'Text', CommandTimeout = '30 '] ВЫБРАТЬ 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 мс) [Parameters = [@ __user_Id_0 = '?' (Размер = 450)], CommandType = 'Text', CommandTimeout = '30 '] SELECT [uc]. [Id], [uc]. [ClaimType], [uc]. [ClaimValue], [uc]. [UserId] ] ОТ [AspNetUserClaims] AS [uc] ГДЕ [uc]. [UserId] = @__ user_Id_0 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: Выполненная команда DbCommand (9 мс) [Parameters '1 (Размер = 450), @__claim_Value_1 = '?' (Размер = 4000), @__claim_Type_2 = '?' (Размер = 4000)], CommandType = 'Text', CommandTimeout = '30 '] SELECT [uc]. [Id], [uc]. [ClaimType], [uc]. [ClaimValue], [uc]. [UserId] ] ОТ [AspNetUserClaims] AS [uc] WHERE (([uc]. [UserId] = @__ 8__locals1_user_Id_0) И ([uc]. [ClaimValue] = @__claim_Value_1)) AND ([uc]. [ClaimType] = @__ )claim_Type] = @__) Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: Выполненная команда DbCommand (6 мс) [Parameters = [@__ 8__locals1_user_Id_0 = '? '(Размер = 450), @__claim_Value_1 ='? ' (Размер = 4000), @__claim_Type_2 = '?' (Размер = 4000)], CommandType = 'Text', CommandTimeout = '30 '] SELECT [uc]. [Id], [uc]. [ClaimType], [uc]. [ClaimValue], [uc]. [UserId] ] FROM [AspNetUserClaims] AS [uc] WHERE (([uc]. [UserId] = @__ 8__locals1_user_Id_0) И ([uc]. [ClaimValue] = @__claim_Value_1)) AND ([uc]. [ClaimType] = @__ )claim_Type] = @__) Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: Выполненная команда DbCommand (93 мс) [Parameters = [@__ 8__locals1_user_Id_0 = '?' (Размер = 450), @__claim_Value_1 = '?' (Размер = 4000), @__claim_Type_2 = '?' (Размер = 4000)], CommandType = 'Text', CommandTimeout = '30 '] SELECT [uc]. [Id], [uc]. [ClaimType], [uc]. [ClaimValue], [uc]. [UserId] ] FROM [AspNetUserClaims] AS [uc] WHERE (([uc]. [UserId] = @__ 8__locals1_user_Id_0) И ([uc]. [ClaimValue] = @__claim_Value_1)) AND ([uc]. [ClaimType] = @__ )claim_Type] = @__) Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: Выполненная команда DbCommand (5 мс) [Parameters = [@__ normalizedUserName_0 = '?' (Размер = 256)], CommandType = 'Text', CommandTimeout = '30 '] ВЫБРАТЬ 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]. [NormalizedUserName] = @__ normalizedUserName_0 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: Выполненные параметры DbCommand (6ms) [Parameters 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 = '?' (Size = 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 ГДЕ [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.AffectedCountModificationCommandBatch.ThrowAggregateUpdateConcurrencyException (Int32 commandIndex, Int32 expectRowsAffected, Int32 rowsAffected) в Microsoft.EntityFrameworkCore.Update.AffectedCountModification.AffectedCountBack (предыдущее местоположение было th___stack.dovemandModification.traceCommandModification.Affected) - в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) в Microsoft.EntityFrameworkCore.UpdateNoDextMode__DextmCount (трассировкой_NoDext_DextMedCount) (трассировка_Конфигурация_задачи). из предыдущего места, где было создано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) в Microsoft.EntityFrameworkCoremaderMatch .d__32.MoveNext () --- Конец трассировки стека из предыдущего места, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task ) в Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.d__1.MoveNext () --- Конец трассировки стека из предыдущего места, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) в системе .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 место, в котором возникло исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) в Microsoft.EntityFrameworkCore.DbContext.d - person Kok How Teh; 17.10.2019
comment
Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: ожидается, что операция с базой данных повлияет на 1 строку (строки), но фактически повлияла на 0 строк. Данные могли быть изменены или удалены после загрузки объектов. См. http://go.microsoft.com/fwlink/?LinkId=527962. для получения информации о понимании и обработке исключений оптимистичного параллелизма. в Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ThrowAggregateUpdateConcurrencyException (Int32 commandIndex, Int32 expectRowsAffected, Int32 rowsAffected) в Microsoft.EntityFrameworkCore.Update.AffectedCountModification.AffectedCountBack (предыдущее местоположение было th___stack.dovemand_exception) (где было выбрано исключение_текста_трассировки). - в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) в Microsoft.EntityFrameworkCore.UpdateMode__.dextmCount (traceCompdate.dextm) из предыдущего места, где было создано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) в Microsoft.EntityFrameworkCoremaderMatch .d__32.MoveNext () --- Конец трассировки стека из предыдущего места, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task ) в Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.d__1.MoveNext () --- Конец трассировки стека из предыдущего места, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) в системе .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 () --- Конец трассировки стека из предыдущего места, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessgerAndotification (Задача) в Microsoft.EntityFrameworkCore.DbContext.d__30.MoveNext () Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory: Информация: Выполненная команда DbCommand (6 мс) [Parameters = [@ 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 = '?' (Size = 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 ГДЕ [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 expectedRowsAffected, Int32 rowsAffected) в Microsoft.EntityFrameworkCropatch.UpdateCore.Update.AffectedCountBesponseDataDataDataDataDataDataDataDataDataDataDataDataDataDataDataDataCountModificationCommandDataDataDataDataCountModificationCommandResponse. EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.Consume (средство чтения DbDataReader) в Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute (соединение IRelationalConnection. StateManager.SaveChanges (логическое acceptAllChangesOnSuccess) в Microsoft.EntityFrameworkCore.DbContext.SaveChanges (логическое acceptAllChangesOnSuccess) - person Ivan Zaruba; 17.10.2019

Выполнение этих действий, полученных от диспетчера ролей

person Kenik    schedule 28.09.2019

Не могли бы вы подробнее рассказать о вашей среде и версиях фреймворков?

Microsoft.AspNetCore.Identity.EntityFrameworkCore 1.0.2; .NET Core 1.1; Windows 10 Pro; Microsoft.EntityFrameworkCore.SqlServer 1.0.3

person Okyam    schedule 12.05.2020