You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:20:39