使用EntityFrameworkCore和MySQL DB进行用户身份验证

时间:2017-03-30 18:30:09

标签: c# asp.net-core asp.net-ajax .net-core entity-framework-core

我正在使用Entity Framework和MySQL开发.Net核心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>();

    }

- UPDATE ----

我发现认证机制是由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);
        }

1 个答案:

答案 0 :(得分:0)

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

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

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

还记得DbContext被加载到&#34;作用域&#34;中的DI容器中。生命周期(默认情况下),这意味着它是每个http请求的单个实例,因此请确保您的代码或任何中间件在从服务容器获取后不会处置DbContext。