MySql.Data.MySqlClient.MySqlException: повторяющаяся запись - PullRequest
0 голосов
/ 30 мая 2019

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

        public async Task<IActionResult> OnPostAsync(string returnUrl = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser {  UserName = Input.Email, Email = Input.Email };
                var result = await _userManager.CreateAsync(user, Input.Password);
                if (result.Succeeded)
                {
                    _logger.LogInformation("User created a new account with password.");

                    var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
                    var callbackUrl = Url.Page(
                        "/Account/ConfirmEmail",
                        pageHandler: null,
                        values: new { userId = user.Id, code = code },
                        protocol: Request.Scheme);

                    await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                        $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

                    await _signInManager.SignInAsync(user, isPersistent: false);
                    return LocalRedirect(returnUrl);
                }
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }

            // If we got this far, something failed, redisplay form
            return Page();
        }

Производит эту трассировку стека:

Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware [1] Произошло необработанное исключение при выполнении запроса.Microsoft.EntityFrameworkCore.DbUpdateException: при обновлении записей произошла ошибка.Смотрите внутреннее исключение для деталей.---> MySql.Data.MySqlClient.-ba42-6d282ccb24a6 'для ключа' PRIMARY 'в MySqlConnector.Core.ServerSession.TryAsyncContinuation (Task 1 task) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:line 1252 at System.Threading.Tasks.ContinuationResultTaskFromResultTask 2.InnerInvoke () в System.Threading.ExecutionContext.RunInternal (ExecutionContext executeContext, StateCallback) обратный вызов конечного объекта ContextCallback ---, конечный объект ContextCallbackтрассировки стека от предыдущего местоположения, где было сгенерировано исключение --- в System.Threading.Tasks.Task.ExecuteWithThreadLocal (Task & currentTaskSlot) --- Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение --- в MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync (IOBehavior ioBehavior) в C: \ projects \ mysqlconnector \ src \ MySqlConnector \ Core \ ResultSet.cs: строка 43 --- Конец внутренней трассировки стека исключений --- в MySql.Data.MySqlClient.MySqletSateRateRateresultSet) в C: \ projects \ mysqlconnector \ src \ MySqlConnector \ MySql.Data.MySqlClient \ MySqlDataReader.cs: строка 81 в MySql.Data.MySqlClient.MySqlDataReader.ReadFirstResultSetAsync (IOBehavior ioBehavior) в MySQL: MySQLстрока 307 в MySql.Data.MySqlClient.MySqlDataReader.CreateAsync (команда MySqlCommand, поведение CommandBehavior, ResultSetProtocol resultSetProtocol, IOBehavior ioBehavior) в C: \ projects \ mysql MySQL-line.SYS. MySQL.MySqlConnector.Core..Internal.RelationalCommand.ExecuteAsync (соединение IRelationalConnection, DbCommandMethod executeMethod, параметры IReadOnlyDictionary 2 parameterValues, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken) --- End of inner exception stack trace --- at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(DbContext _, ValueTuple 2, CancellationToken cancellationToken) в Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.ExecuteAsync [TState, TResult] (состояние TState, Func 4 operation, Func 4 verifySucceeded, CancellationToken CancellationThange.Negn.ExcainCan1 entriesToSave, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken) at Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore 9.CreateAsync (пользователь TUser, CancellationToken cancellationToken) в Chuchubi.Data.MultiTenant.TenantUserStore.CreateAsync (пользователь ApplicationUser, CancellationToken cancellationToken) в C: \ Users \ Dropbox \ Code \ chuchubi-backTend \ ChuchataTenantUserStore.cs: строка 30 в Microsoft.AspNetCore.Identity.UserManager 1.CreateAsync(TUser user) at Microsoft.AspNetCore.Identity.UserManager 1.CreateAsync (пользователь TUser, строковый пароль) в Chuchubi.Areas.Identity.Pages.Account.RegisterModel.OnPostAsync (String returnUrl) в C:\ Dropbox \ Code \ chuchubi-backend \ Chuchubi \ Areas \ Identity \ Pages \ Account \ Register.cshtml.cs: строка 71 в Microsoft.AspNetCore.Mvc.RazorPages.Internal.ExecutorFactory.GenericTaskHandlerMethod.Convert [T ]ject Object Objectв Миcrosoft.AspNetCore..PageActionInvoker.InvokeNextPageFilterAsync ()в Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.Rethrow (контекст PageHandlerExecutedContext) в Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.Next (Состояние и следующее, Область и область действия, Объект и состояние, Логическое значение и isCompleted) в Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker.InvokeInnerFilterAsync () в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter () в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow (контекст ResourceExecutedContext) в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next (State & next, Scope & scope, Object & state, Boolean & isCompleted) в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync () в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync () в Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke (HttpContext httpContext) в Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke (контекст HttpContext) в Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke (контекст HttpContext) в SaasKit.Multitenancy.Internal.TenantResolutionMiddleware 1.Invoke(HttpContext context, ITenantResolver 1 tenantResolver) в Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke (контекст HttpContext) в Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.Invoke (контекст HttpContext) в Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke (HttpContext httpContext) в Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke (HttpContext httpContext) в Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke (контекст HttpContext) информация: Microsoft.AspNetCore.Hosting.Internal.WebHost [2]

Это было из автоматически сгенерированного кода из visual studio.

РЕДАКТИРОВАТЬ:

Сведения о версии MySql:

'immediate_server_version', '999999'
'innodb_version', '8.0.16'
'original_server_version', '999999'
'protocol_version', '10'
'slave_type_conversions', ''
'tls_version', 'TLSv1,TLSv1.1,TLSv1.2'
'version', '8.0.16'
'version_comment', 'MySQL Community Server - GPL'
'version_compile_machine', 'x86_64'
'version_compile_os', 'Win64'
'version_compile_zlib', '1.2.11'

мой csproj:

    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.4" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.2.3" />
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.2.0" />
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql.Design" Version="1.1.2" />
    <PackageReference Include="SaasKit.Multitenancy" Version="1.1.4" />

Это делается для пустой базы данных, после ошибки в базу данных не вставляется пользователь!

1 Ответ

0 голосов
/ 31 мая 2019

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

Используя SaasKit, я кэшировал модель базы данных Tenant в память, создавая нового пользователя следующим образом:

IdentityUser.Tenant = cachedTenant;
DbContext.SaveChanges();

Entityframework рассматривает Арендатора как нового арендатора (не отслеживаемого), что приводит к дублированию сообщения.

Таким образом, дублированное сообщение было фактически для нового арендатора.

Исправлено путем кэширования «модели представления» вместо модели базы данных.

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