在迁移期间使用存储在环境变量中的数据库连接字符串

Using a database connection string stored in environment variable during migrations

我有 ASP.NET 核心项目,我在其中将我的 PostgreSQL 连接字符串存储在一个环境变量中。当我尝试进行初始迁移时,项目构建成功,但随后抛出异常:

System.ArgumentNullException:值不能为空。 (参数'connectionString').

所以我假设它没有正确读取连接字符串。 我在 ConfigureServices 方法中为我的 DbContext 提供连接字符串,如下所示:

services.AddDbContext<GoalsContext>(options =>  
  options.UseNpgsql(Environment.GetEnvironmentVariable("CONNECTION_STRING")));

我也曾尝试通过像这样创建 IDesignTimeDbContextFactory 的实现来解决此问题:

public class GoalsContextFactory : IDesignTimeDbContextFactory<GoalsContext>
{
  public GoalsContext CreateDbContext(string[] args)
  {
    var optionsBuilder = new DbContextOptionsBuilder<GoalsContext>();
    optionsBuilder.UseNpgsql(Environment.GetEnvironmentVariable("CONNECTION_STRING");

    return new GoalsContext(optionsBuilder.Options);
  }
}

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

更新: 我已经按照评论中的建议阅读了关于环境变量和配置的官方文档,并且我首先通过使用一种方法创建控制器来检查变量是否存在,returns 一个像这样的连接字符串:

[HttpGet]
public string GetConnectionString()
{
  return _config["CONNECTION_STRING"];
}

当我启动它时,正确的连接字符串确实显示在浏览器中,但是当我尝试将初始迁移添加到数据库时,我已经提到的异常仍然被抛出。

我还尝试注释掉我对 IDesignTimeDbContextFactory 的实现,并在我的 Program.cs 中手动添加对 .AddEnvironmentVariables 方法的调用(我读到的是自动完成的,但我仍然想尝试),但是none 有任何影响 - 我的控制器仍然输出连接字符串,而 Entity Framework Core 的迁移仍然没有收到它。

简而言之,是的,连接字符串存在,我什至可以输出它,但由于相同的异常,迁移仍然失败。

根据我的评论。

此外,如果您想绕过变量的设置,您需要查看 Context 的 OnConfiguring 方法重载,并在传递的 DbOptions 参数上使用 IsConfigured 标志in 仅在没有有效配置传递给上下文时才从文件中读取。

我应该警告说,当其他开发人员使用该解决方案时,这也会导致问题,而且,您不应该将您读入的文件检查到 public 源代码控制存储库中,因为这是一个人们获得凭据的方式他们不应该,看看 User Secrets