我正在使用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);
}
答案 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。