【问题标题】:how to read connection string from another project appsettings file如何从另一个项目 appsettings 文件中读取连接字符串
【发布时间】:2021-09-13 09:05:33
【问题描述】:

项目说明:

我是 ASP NET CORE 的新手。 首先使用 DB 我的解决方案中有三个项目。是哪个。

User.API(网络 API 项目)

User.Data(具有数据库方法和 db insatace 的 c# 类库)

User.Model(具有脚手架数据库上下文的 c# 类库和 生成的模型类)

请求流程是这样的,Api调用Data project中的GetUser()方法,然后Data项目使用Db Context实例取回数据。

问题: 在上下文文件中我有

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
              optionsBuilder.UseSqlServer("Server=.;Database=UserDB;Trusted_Connection=True;");
            }
        }

我想使用命名连接而不是像下面这样的硬编码连接字符串

optionsBuilder.UseSqlServer("name=UserCloudConnectionString");

我尝试了不同的解决方案like this,但无法得到它。哪个项目我必须添加一个文件,我需要在startup.cs文件中添加json文件

任何帮助将不胜感激。

【问题讨论】:

  • 不要OnConfiguring中配置连接字符串。在注册 DbContext 的 AddDbContext 调用中执行此操作。此时您可以访问Configuration 并可以调用Configuration.GetConnectionString("MyConnection") 来获取连接字符串。 appsettings 不是特殊文件,它只是包含设置的 JSON 文件的默认名称。此类设置(包括连接字符串)可以来自环境变量、命令行参数或其他来源。要阅读它们,您需要访问配置中间件,例如通过IConfiguration
  • OnConfiguring 是 Context 文件中生成的方法。当我使用脚手架命令从数据库中获取表时。它是这样生成的。
  • 是的,但这并不意味着您需要使用它。无法从inside DbContext 中按名称读取连接字符串。这些设置可通过配置中间件获得。 DbContext 与该中间件无关。

标签: c# asp.net asp.net-core asp.net-web-api


【解决方案1】:

不要在OnConfiguring 中配置连接字符串。在注册 DbContext 的 AddDbContext 调用中执行此操作。此时您可以访问Configuration 并可以调用Configuration.GetConnectionString("MyConnection") 来获取连接字符串。

services.AddDbContext(optionsBuilder=>
{
    var cns=Configuration.GetConnectionString("UserCloudConnectionString");
    optionsBuilder.UseSqlServer(cns);
}        

appsettings 不是一个特殊文件,web.config 是这样。它只是包含设置的 JSON 文件的默认名称。此类设置(包括连接字符串)可以来自环境变量、命令行参数或其他来源。要阅读它们,您需要访问配置中间件,例如通过IConfiguration

DbContext 类没有硬连线以使用配置或任何其他中间件,因此它无法按名称读取连接字符串。它 是为处理外部配置而构建的。在生成的代码中,!optionsBuilder.IsConfigured 检查 DbContext 是否已经配置,例如 AddDbContext

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    if (!optionsBuilder.IsConfigured)
    {
        ......
    }
}

即使您不使用依赖注入,您也可以通过DbContext(DbContextOptions) 构造函数创建和传递连接设置。 DbContextOptions 是一个抽象类,所以你需要使用DbContextOptionsBuilder< T> 来创建它:

var cns=... //Get the connection string from somewhere
var optionsBuilder=new DbContextOptionsBuilder<MyDbContext>();
var options=optionsBuilder
                 .UseSqlServer(cns)
                 .Options;

using var ctx=new MyDbContext(options);

【讨论】:

  • 再次,我花了一段时间才明白你所说的。我必须添加var optionsBuilder = new DbContextOptionsBuilder&lt;UserContext&gt;(); 才能使其工作。再次感谢这很有帮助
猜你喜欢
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
相关资源
最近更新 更多