EF Core迁移更新时指定连接字符串报错的问题排查
问题:EF Core迁移时指定连接字符串名称报错
场景说明
为单元测试搭建测试数据库,添加了名为Testing的第二个连接字符串,执行以下命令时触发错误:
dotnet ef database update --context ApplicationDbContext --connection "Testing"
报错内容
Format of the initialization string does not conform to specification starting at index 0.
异常现象
- 应用程序正常运行时,两个连接字符串都能正常使用,仅在迁移/更新数据库环节出错
- 不指定连接字符串时,迁移操作能正常完成,但只会更新
DefaultConnection对应的数据库
排查验证
在ApplicationDbContext中添加日志代码,确认连接字符串配置正确:
public ApplicationDbContext( DbContextOptions options, IOptions<OperationalStoreOptions> operationalStoreOptions) : base(options, operationalStoreOptions) { Console.WriteLine(options.FindExtension<SqlServerOptionsExtension>().ConnectionString); }
控制台输出显示连接字符串内容正确,但只要通过命令行指定连接字符串就会触发格式化错误。
完整执行日志
C:\Projects\RateMyManagementWASM\src\Server>dotnet ef database update Build started... Build succeeded. Server=(localdb)\mssqllocaldb;Database=RateMyManagementWASMLocalDb;Trusted_Connection=True;MultipleActiveResultSets=truewarn: Microsoft.EntityFrameworkCore.Model.Validation[10400] Sensitive data logging is enabled. Log entries and exception messages may include sensitive application data; this mode should only be enabled during development. Done. C:\Projects\RateMyManagementWASM\src\Server>dotnet ef database update 0 --connection "DefaultConnection" Build started... Build succeeded. Server=(localdb)\mssqllocaldb;Database=RateMyManagementWASMLocalDb;Trusted_Connection=True;MultipleActiveResultSets=truewarn: Microsoft.EntityFrameworkCore.Model.Validation[10400] Sensitive data logging is enabled. Log entries and exception messages may include sensitive application data; this mode should only be enabled during development. System.ArgumentException: Format of the initialization string does not conform to specification starting at index 0. at Microsoft.Data.Common.DbConnectionOptions.GetKeyValuePair(String connectionString, Int32 currentPosition, StringBuilder buffer, Boolean useOdbcRules, String& keyname, String& keyvalue) at Microsoft.Data.Common.DbConnectionOptions.ParseInternal(Dictionary`2 parsetable, String connectionString, Boolean buildChain, Dictionary`2 synonyms, Boolean firstKey) at Microsoft.Data.Common.DbConnectionOptions..ctor(String connectionString, Dictionary`2 synonyms) at Microsoft.Data.SqlClient.SqlConnectionString..ctor(String connectionString) at Microsoft.Data.SqlClient.SqlConnectionFactory.CreateConnectionOptions(String connectionString, DbConnectionOptions previous) at Microsoft.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(DbConnectionPoolKey key, DbConnectionPoolGroupOptions poolOptions, DbConnectionOptions& userConnectionOptions) at Microsoft.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key) at Microsoft.Data.SqlClient.SqlConnection.set_ConnectionString(String value) at Microsoft.Data.SqlClient.SqlConnection..ctor(String connectionString) at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerConnection.CreateDbConnection() at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.get_DbConnection() at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected) at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.<>c__DisplayClass18_0.<Exists>b__0(DateTime giveUp) at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.<>c__DisplayClass12_0`2.<Execute>b__0(DbContext _, TState s) at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded) at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.Execute[TState,TResult](IExecutionStrategy strategy, TState state, Func`2 operation, Func`2 verifySucceeded) at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.Exists(Boolean retryOnNotExists) at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.Exists() 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) Format of the initialization string does not conform to specification starting at index 0.
无效尝试
- 修改连接字符串,移除
Trusted_Connection和MultipleActiveResultSets配置项 - 显式指定
--context参数
解决方案
Jeremy Lakeman的回答解决了问题:执行dotnet ef database update命令时,--connection参数必须传入完整的连接字符串内容,不能只写配置文件中的连接字符串名称。之前混淆了命令规则,因为其他部分命令允许仅指定连接字符串名称。
内容的提问来源于stack exchange,提问作者Connor Hallman
相关产品推荐
相关产品推荐

