使用 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 没有处理它。
我正在使用 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 没有处理它。