执行Update-Database命令时MySqlConnection已释放错误求助
Update-Database 执行报错:Cannot access a disposed object. Object name: 'MySqlConnection'
使用ASP.NET 7.0 + MySQL环境,已安装MySqlConnector和Pomelo.EntityFrameworkCore.MySql依赖包,测试代码可正常从数据库获取数据,但在程序包管理器控制台执行Update-Database命令时,抛出以下错误:
fail: Microsoft.EntityFrameworkCore.Database.Connection[20004] An error occurred using the connection to database 'mydb' on server 'localhost'. An error occurred using the connection to database 'mydb' on server 'localhost'. System.ObjectDisposedException: Cannot access a disposed object. Object name: 'MySqlConnection'. at MySqlConnector.MySqlConnection.VerifyNotDisposed() in /_/src/MySqlConnector/MySqlConnection.cs:line 1002 at MySqlConnector.MySqlConnection.OpenAsync(Nullable`1 ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlConnection.cs:line 388 at MySqlConnector.MySqlConnection.Open() in /_/src/MySqlConnector/MySqlConnection.cs:line 382 at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(Boolean errorsExpected) at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternal(Boolean errorsExpected) at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected) at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlRelationalConnection.Open(Boolean errorsExpected) at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteScalar(RelationalCommandParameterObject parameterObject) at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists() at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration) at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String connectionString, String contextType) at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String connectionString, String contextType) at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0() at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action) Cannot access a disposed object. Object name: 'MySqlConnection'.
相关代码
Program.cs中的数据库配置:
using var connectionString = new MySqlConnection(builder.Configuration.GetConnectionString("DefaultConnection")); var serverVersion = new MySqlServerVersion(new Version(8, 0, 31)); builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(connectionString, serverVersion)); builder.Services.AddDatabaseDeveloperPageExceptionFilter(); builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>();
appsettings.json中的连接字符串:
"DefaultConnection": "server=localhost;port=3306;User ID=root;Password=password;Database=mydb"
解决方案
问题根源是using var声明的MySqlConnection会在代码块执行完毕后自动释放连接对象,而EF Core迁移工具运行时需要复用该连接,导致出现已释放对象的错误。
修改代码,直接传入连接字符串让EF Core自行管理连接生命周期:
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); var serverVersion = new MySqlServerVersion(new Version(8, 0, 31)); builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(connectionString, serverVersion)); // 其余代码保持不变
EF Core的UseMySql方法支持直接接收连接字符串,内部会根据需求创建、打开和释放连接,避免手动管理连接生命周期带来的资源释放问题。
内容的提问来源于stack exchange,提问作者unelectricpostrequest
相关产品推荐
相关产品推荐

