使用 EntityFrameworkCore 和 MySQL 数据库的用户身份验证不起作用

User Authentication with EntityFrameworkCore and MySQL DB not working

我正在使用 Entity Framework 和 MySQL 开发 .Net Core Web 应用程序,当我尝试注册为用户时,我收到以下消息。

An unhandled exception occurred while processing the request.
InvalidOperationException: Connection must be valid and open to commit transaction
MySql.Data.MySqlClient.MySqlTransaction.Commit()

这是我的数据库上下文

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

    }
}

}

这是我的启动代码

    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseMySQL(Configuration.GetConnectionString("DefaultConnection")));

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        services.AddMvc();

        // Add application services.
        services.AddTransient<IEmailSender, AuthMessageSender>();
        services.AddTransient<ISmsSender, AuthMessageSender>();

    }

--更新----

我发现Authentication机制是由Ajax而不是EF完成的,问题似乎源于这行代码。

    public async Task<IActionResult> Register(RegisterViewModel model, string returnUrl = null)
    {
        ViewData["ReturnUrl"] = returnUrl;
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
   PROBLEM LINE====>         var result = await _userManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await _signInManager.SignInAsync(user, isPersistent: false);
                _logger.LogInformation(3, "User created a new account with password.");
                return RedirectToLocal(returnUrl);
            }
            AddErrors(result);
        }

前几天晚上我和其他几个人遇到了完全相同的问题。这是异步和 Oracle MySQL 提供程序的某种问题。如果您重写 DbContext 的 dispose 方法并在其中放置一个断点,您会看到上下文在某些登录步骤完成之前就已被释放。我发现了另一个 SO 问题(现在无法在移动设备上找到它),它有类似的问题并建议用这个替换 Oracle MySQL 包:

https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

这解决了我在添加迁移时遇到的与处理长度超过 255 的 varbinary 数据类型相关的问题和另一个问题。

还要记住 DbContext 在 "scoped" 生命周期内(默认情况下)被加载到 DI 容器中,这意味着它是每个 http 请求的单个实例,因此请确保您的代码或您拥有的任何中间件从服务容器获取 DbContext 后,place 没有处理它。