C# EntityFrameworkCore和MySQL DB的用户身份验证不起作用
我正在使用Entity Framework和MySQL开发一个.Net核心Web应用程序,当我尝试注册为用户时,我收到以下消息C# EntityFrameworkCore和MySQL DB的用户身份验证不起作用,c#,asp.net-core,asp.net-ajax,.net-core,entity-framework-core,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.C
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类ApplicationDbContext:IdentityDbContext
{
公共应用程序DBContext(DbContextOptions选项)
:基本(选项)
{
}
模型创建时受保护的覆盖无效(ModelBuilder)
{
基于模型创建(生成器);
}
}
}
这是我的启动代码
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>();
}
public void配置服务(IServiceCollection服务)
{
//添加框架服务。
services.AddDbContext(选项=>
options.UseMySQL(Configuration.GetConnectionString(“DefaultConnection”));
服务.额外性()
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
services.AddMvc();
//添加应用程序服务。
services.AddTransient();
services.AddTransient();
}
--更新----
我发现身份验证机制是由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);
}
公共异步任务寄存器(RegisterViewModel模型,字符串returnUrl=null)
{
ViewData[“ReturnUrl”]=ReturnUrl;
if(ModelState.IsValid)
{
var user=newapplicationuser{UserName=model.Email,Email=model.Email};
问题行==>var result=await\u userManager.CreateAsync(用户、模型、密码);
if(result.successed)
{
wait _signInManager.SignInAsync(用户,ispersist:false);
_logger.LogInformation(3,“用户使用密码创建了一个新帐户”);
返回重定向到本地(returnUrl);
}
加法器(结果);
}
前几天晚上,我遇到了与其他几个问题完全相同的问题。这是async和Oracle MySQL提供程序的某种问题。如果覆盖DbContext的dispose方法并在其中放置断点,您会看到在某些登录步骤完成之前上下文已被释放。我发现了另一个问题(目前在移动设备上找不到),它也有类似的问题,建议使用此软件包替换Oracle MySQL软件包: 这修复了这个问题以及我在添加迁移时遇到的另一个与处理长度超过255的varbinary数据类型有关的问题
还请记住,DbContext在“作用域”生存期内加载到DI容器中(默认情况下),这意味着每个http请求只有一个实例,因此请确保您的代码或任何中间件在从服务容器获取DbContext后没有处理它。前几天晚上,我遇到了与其他几个问题完全相同的问题。这是async和Oracle MySQL提供程序的某种问题。如果您超过取消DbContext的dispose方法并在其中放置一个断点,您会看到在某些登录步骤完成之前,上下文已被释放。我发现了另一个SO问题(在mobile上目前找不到),该问题存在类似问题,建议使用此问题替换Oracle MySQL包: 这修复了这个问题以及我在添加迁移时遇到的另一个与处理长度超过255的varbinary数据类型有关的问题
还请记住,DbContext在“作用域”生存期内加载到DI容器中(默认情况下),这意味着它是每个http请求的一个实例,因此请确保您的代码或您现有的任何中间件在从服务容器获取DbContext后没有处理该DbContext。您确定在appsettings.json中有用于“DefaultConnection”的有效连接字符串吗?是的,连接字符串可以正常工作。对于其他数据,它实际上可以正常工作,只有通过身份验证才会出现此类问题。您确定在appsettings.json中有有效的连接字符串用于“DefaultConnection”吗?是的,连接字符串可以正常工作。对于其他数据,它实际上可以正常工作,只是在身份验证的情况下才会出现这样的问题。是的!非常感谢。我同意,我认为这是因为它在预发布版本中,仍然存在错误。但是Pomelo.EntityFrameworkCore.MySql库可以正常工作!谢谢!是的!非常感谢。我同意,我认为这是因为它在预发行版中,仍然有bug。但是Pomelo.EntityFrameworkCore.MySql库工作得很好!谢谢!