.net 核心未连接到 appsettings.json 连接字符串中已更改的数据库 visual studio 调试

.net core not connecting to the changed database in appsettings.json connectionstrings in visual studio debug

我正在做一个 .net 核心项目,我想更改 appsettings.json 中数据库的连接字符串。 我创建了一个副本数据库并将其命名为 originalname_fake01 并克隆了原始数据库以进行测试。

我也更改了 appsettings.developement.json 中的数据库名称。一切似乎都很好,但是当我 运行 应用程序在 visual studio 中处于调试模式时。数据是从原始数据库中提取的,而不是 appsettings.json.

中更改的数据库名称

这是我的 appsettings connectionstrings 代码: 旧的连接字符串是

"connectionStrings": {
"MyConnectionString": 
"Server=localhost;port=3306;database=mydb;user=root;password=rt123;"
}

更改了连接字符串(新)

"connectionStrings": {
"FakeConnectionString": 
"Server=localhost;port=3306;database=mydb_fake01;user=root;password=rt123;"
}

我无法理解为什么它连接到旧数据库而不是新数据库,即使在更改 connectionstring 之后也是如此。

如有任何帮助,我们将不胜感激。

如果您希望开发设置覆盖生产设置,您需要使用相同的名称和完整路径。如果您希望 DbContext 自动选择它,您的连接字符串应该命名为 MyConnectionString,而不是 MyConnectionString

JSON设置文件在.NET Core中没有特殊意义,它们只是文件。每个提供者都以 Section1:Subsection1:Attribute1, Value 的形式生成 key/value 对。较新的提供程序值会覆盖较早的值。提供者可以是 JSON 或 XML 文件阅读器、INI 文件阅读器、数据库等。在所有情况下,设置都被扁平化为 path/value 对。

文件

"connectionStrings": {
    "MyConnectionString": "Server=localhost;port=3306;database=mydb;user=root;password=rt123;"
}

生成一个名为 connectionStrings:MyConnectionString 的值,其值为 Server=localhost;port=3306;database=mydb;user=root;password=rt123;。要覆盖它,您需要使用 相同 路径指定设置。

默认主机生成器指定 some default settings providers。从文档中,这些是:

  • appsettings.json.
  • appsettings.{Environment}.json. = Secret Manager when the app runs in the Development environment.
  • Environment variables.
  • Command-line arguments.

列表下方指定的设置会覆盖之前的设置。这意味着在开发机器上,appsettings.Developoment.json 中的 connectionStrings:MyConnectionString 会覆盖 appsettings.json.

中的同名元素

这也意味着我们可以用环境变量或命令行参数覆盖连接字符串,例如

dotnet run /connectionStrings:MyConnectionString Server=localhost;port=3306;database=mydb;user=root;password=rt123;

你快到了。在更改的连接字符串(新)设置中,将 FakeConnectionString 更改为 MyConnectionString。如果您在 appsettings.jsonappsettings.development.json 中有相同的键,那么后者将覆盖前者。

"connectionStrings": {
    "MyConnectionString": "Server=localhost;port=3306;database=mydb_fake01;user=root;password=rt123;"
}

P.S. This is applicable to any environment not only to development

还有一个名为 "secrets.json" 的文件会覆盖所有其他 appSettings 配置。确保它具有正确的数据库名称。

我终于能够在 dbcontext.cs 模型构建器中找到问题所在。有一个代码行具有强类型模式名称。

protected override void OnModelCreating(ModelBuilder modelBuilder)
      {
         base.OnModelCreating(modelBuilder);
         OnModelCreatingImpl(modelBuilder);

         modelBuilder.HasDefaultSchema("MyDB");
}

我使用新架构更改了它,如下所示:

modelBuilder.HasDefaultSchema("MyDB_Fake01");

我不明白为什么我们需要在连接字符串和模型构建器中都给出架构名称。我想我们应该避免在 ModelBuilder 中以显式模式名称为目标,以便在更改连接字符串时。它将正确定位数据库。

无论如何,问题已解决,因为应用程序正在连接到预期的数据库。

名为“secrets.json”的文件对我有用,因为默认连接字符串被硬编码在那里指向旧数据库。编辑连接字符串 (Initial Catalog=dbName) 以指向当前数据库名称解决了这个问题。谢谢!

“secrets.jason”的示例内容: { “ConnectionStrings:DefaultConnection”:“数据源=TestSource;初始目录=dbName;集成安全性=True;MultipleActiveResultSets=True” }