【问题标题】:Connection error on UserManager CreateAsyncUserManager CreateAsync 上的连接错误
【发布时间】:2017-09-01 00:25:10
【问题描述】:

尝试使用 UserManager CreateAsync 方法创建新用户时出现以下错误。我正在使用未修改的 IdentityUser 和 IdentityRole。我有一些从数据库中填充数据的 DBSet,所以读取不是问题,只是写入似乎是。

    {System.InvalidOperationException: Connection must be valid and open to commit transaction at MySql.Data.MySqlClient.MySqlTransaction.Commit()
   at Microsoft.EntityFrameworkCore.Storage.RelationalTransaction.Commit()
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.<ExecuteAsync>d__10.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.<SaveChangesAsync>d__54.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.<SaveChangesAsync>d__52.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.EntityFrameworkCore.DbContext.<SaveChangesAsync>d__35.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`9.<CreateAsync>d__36.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Identity.UserManager`1.<CreateAsync>d__68.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Identity.UserManager`1.<CreateAsync>d__73.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Controllers.Auth.AuthController.<Register>d__9.MoveNext() in AuthController.cs:line 102}

我正在使用;

  • MySQL 实体框架核心 7.0.7-m61
  • Visual Studio 2017
  • ASP.NET Core MVC 1.1.0
  • 身份 1.1

错误中提到的第 102 行是 var result = await userManager.CreateAsync(newUser, model.Password);

        [HttpPost]
        public async Task<ActionResult>Register(RegisterViewModel model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var newUser = new IdentityUser
                    {
                        Email = model.Email,
                        UserName = model.Username
                    };

                    var result = await _userManager.CreateAsync(newUser, model.Password);

                    if (result.Succeeded)
                    {
                        await _signInManager.SignInAsync(newUser, false);
                        _logger.LogInformation($"New user account created: {model.Username}");

                        return RedirectToAction("Index", "App");
                    }

                    _logger.LogError($"Registration failed for {model.Username}: ", result.Errors);

                    return View(model);
                }

                return View(model);
            }
            catch (Exception ex)
            {
                _logger.LogError("Database Failure: ", ex);
                return View(model);
            }
        }

我正在学习 asp.net,在这里我偶然发现我希望这是一个明显的错误,因为它似乎是一个基本的连接问题,但这没有意义,因为可以使用 IdentityDBContext 查询数据库,但不能通过UserManager,据我了解,它使用 IdentityDBContext 连接。

【问题讨论】:

  • 另外请注意:没有MVC6,也没有Identity 3!这个过时的条款只会带来混乱,所有的包都在 18 个月前(!!)重新命名。 ASP.NET Core MVC 和 ASP.NET Core Identity 都被重命名(将 Core 添加到名称中并将版本重置为 1.0)与 ASP.NET Core 的 rc2 版本,以表明它是一个完整的重写,并且在 no方式兼容与以前版本的 MVC 和 Identity

标签: mysql asp.net-core asp.net-identity entity-framework-core


【解决方案1】:

不要使用MySql.Data.EntityFrameworkCore-7.0.7-m61 提供者并使用其他东西。 Oracle 的每个预发布版本都让自己感到尴尬。

在此版本中,他们设法使程序包变得如此困难,以至于它无法使用,因为该提供程序似乎在每次查询后都会关闭它的连接。请改用Pomelo.EntityFrameworkCore.MySql 1.1.0(或等待Oracles 提供程序的下一个版本)。 Oracle 在使用当前提供程序版本支持 ADO.NET/EF 方面向来不强

更好的是,改用 PostgreSQL 或 SqlServer。

【讨论】:

  • 感谢您的更正、信息和建议。我现在正在使用 Pomelo Entityframework MySql v1.1.0,我现在可以创建用户了。
  • Do not use MySql.Data.EntityFrameworkCore。该死的直。好没用的包,竟然不支持SaveChangesAsync
猜你喜欢
  • 2020-11-29
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 2020-05-05
  • 2021-01-22
相关资源
最近更新 更多