提问人:Stefan 提问时间:10/21/2023 最后编辑:Dale KStefan 更新时间:10/22/2023 访问量:58
通过 CLI 进行数据库更新的连接字符串
Connectionstring via CLI for database update
问:
我正在学习多租户,其中每个租户都有自己的数据库。
这个想法是通过使用 finbuckle NuGet 包,它从 .appsettings.development.json
但是,对于创建迁移和更新数据库,必须将连接字符串作为参数传递。
我的数据库是通过 Docker 使用命令的:
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=myPassword" -p 1433:1433 --name sqlTest--hostname sqlTest -d mcr.microsoft.com/mssql/server:2022-latest
使用 Azure Data Studio,我成功连接到数据库。
每当我想使用命令时:
dotnet ef database update -- --connection-string "Server=localhost,1433; Database=test; User Id=SA; Password=myPassword"
我收到错误:
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.Diagnostics.RelationalLoggerExtensions.MigrateUsingConnection(IDiagnosticsLogger`1 diagnostics, IMigrator migrator, IRelationalConnection connection)
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.
我已经尝试了多种连接字符串格式,例如放置 IP 而不是 localhost 并将端口添加到服务器名称中。但我总是以同样的错误告终,我不知道该何去何从。
答:
2赞
Maytham Fahmi
10/22/2023
#1
我已经玩过你的命令,我假设你和我一样使用 Windows 操作系统。我在你的尝试中发现了一些东西,这是我的答案。
- 在此答案中提到的连接字符串中,需要用作服务器名称。
127.0.0.1\sqlTest
- 在您的 dotnet 命令中,您正在使用我认为是拼写错误或不正确的东西,请检查此答案命令行连接字符串以获取 EF 核心数据库更新。
-- --connection-string
- 最后,我遇到了一个问题,即与服务器已成功建立连接,但在登录过程中发生了错误。(错误编号:233)并通过添加到连接字符串来解决它。
TrustServerCertificate=True
- 我使用了另一个密码,而不是在docker中,MSSQL服务器将返回如下错误:
Qwer!234
myPassword
ERROR: Unable to set a system administrator password: Password validation failed. The password does not meet SQL Server password policy requirements because it is not complex enough. The password must be at least 8 characters long and contain characters from three of the following four sets: Uppercase letters, Lowercase letters, Base 10 digits, and Symbols
因此,以下是我为使其工作所做的所有步骤(我的 EF 项目名为 WebApplication1):
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=Qwer!234" -p 1433:1433 --name sqlTest --hostname sqlTest -d mcr.microsoft.com/mssql/server:2022-latest
dotnet ef migrations add InitialCreate --project .\WebApplication1.csproj
dotnet ef database update --connection "Server=127.0.0.1\sqlTest,1433; User Id=sa; Password=Qwer!234; Database=test; TrustServerCertificate=True"
Azure Data Studio 的连接字符串是第一次没有数据库名称,因为它尚未创建:
Server=127.0.0.1\sqlTest,1433; User Id=sa; Password=Qwer!234;
但是,在创建数据库时,您可以使用
Server=127.0.0.1\sqlTest,1433; User Id=sa; Password=Qwer!234; Database=test
以下是结果的屏幕截图:
和 Azure Data Studio:
评论
-connection
CLI 选项?