通过 CLI 进行数据库更新的连接字符串

Connectionstring via CLI for database update

提问人:Stefan 提问时间:10/21/2023 最后编辑:Dale KStefan 更新时间:10/22/2023 访问量:58

问:

我正在学习多租户,其中每个租户都有自己的数据库。

这个想法是通过使用 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 并将端口添加到服务器名称中。但我总是以同样的错误告终,我不知道该何去何从。

C# sql-server docker 实体框架 连接字符串

评论

0赞 Maytham Fahmi 10/21/2023
为什么更新后-- --?
0赞 AlwaysLearning 10/21/2023
也许您正在寻找 --connection CLI 选项?
0赞 Maytham Fahmi 10/29/2023
欢迎您查看我的回答是否有帮助

答:

2赞 Maytham Fahmi 10/22/2023 #1

我已经玩过你的命令,我假设你和我一样使用 Windows 操作系统。我在你的尝试中发现了一些东西,这是我的答案。

  1. 在此答案中提到的连接字符串中,需要用作服务器名称。127.0.0.1\sqlTest
  2. 在您的 dotnet 命令中,您正在使用我认为是拼写错误或不正确的东西,请检查此答案命令行连接字符串以获取 EF 核心数据库更新-- --connection-string
  3. 最后,我遇到了一个问题,即与服务器已成功建立连接,但在登录过程中发生了错误。(错误编号:233)并通过添加到连接字符串来解决它。TrustServerCertificate=True
  4. 我使用了另一个密码,而不是在docker中,MSSQL服务器将返回如下错误:Qwer!234myPasswordERROR: 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

以下是结果的屏幕截图:

enter image description here

和 Azure Data Studio:

enter image description here