使用EntityFrameworkCore和MySQL DB進行用戶身份驗證

.net-core asp.net-ajax asp.net-core c# entity-framework-core

我正在使用實體框架和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);
        }

一般承認的答案

那天晚上我和其他幾個人有同樣的問題。這是async和Oracle MySQL提供程序的某種問題。如果您覆蓋DbContext的dispose方法並在其中放置斷點,您會看到在完成某些登錄步驟之前上下文已被釋放。我發現了另一個SO問題(現在在移動設備上找不到),它有類似的問題,建議用這個替換Oracle MySQL包:

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

這解決了問題以及我在處理添加遷移時長度超過255的varbinary數據類型時遇到的另一個問題。

還記得DbContext在“scoped”生命週期中被加載到DI容器中(默認情況下),這意味著它是每個http請求的單個實例,因此請確保您的代碼或任何中間件沒有處置DbContext從服務容器中獲取它之後。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow