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

C# 在迁移期间使用存储在环境变量中的数据库连接字符串,c#,asp.net-core,entity-framework-core,connection-string,entity-framework-core-migrations,C#,Asp.net Core,Entity Framework Core,Connection String,Entity Framework Core Migrations,我有一个ASP.NET核心项目,其中我将PostgreSQL连接字符串存储在一个环境变量中。当我尝试进行初始迁移时,项目的构建成功,但随后抛出异常: System.ArgumentNullException:值不能为null。(参数“connectionString”) 因此,我假设它没有正确读取连接字符串。 我在ConfigureServices方法中向我的DbContext提供连接字符串,如下所示: services.AddDbContext(选项=> UseNpgsql(Environme

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

System.ArgumentNullException:值不能为null。(参数“connectionString”)

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

services.AddDbContext(选项=>
UseNpgsql(Environment.GetEnvironmentVariable(“CONNECTION_STRING”));
我还尝试通过创建IDesignTimeDbContextFactory的实现来解决此问题,如下所示:

公共类GoalsContextFactory:IDesignTimeDbContextFactory
{
public GoalsContext CreateDbContext(字符串[]args)
{
var optionsBuilder=new DbContextOptionsBuilder();
optionsBuilder.UseNpgsql(Environment.GetEnvironmentVariable(“连接字符串”);
返回新的GoalsContext(optionsBuilder.Options);
}
}
任何帮助都将不胜感激

更新: 我已经按照评论中的建议阅读了有关环境变量和配置的官方文档,并通过使用一个方法创建控制器来检查变量是否存在,该方法返回如下连接字符串:

[HttpGet]
公共字符串GetConnectionString()
{
返回_config[“连接字符串”];
}
当我启动浏览器时,正确的连接字符串确实会显示在浏览器中,但当我尝试向数据库添加初始迁移时,仍然会抛出我前面提到的异常

我还尝试注释我的IDesignTimeDbContextFactory实现,并在Program.cs中手动添加对.addenEnvironmentVariables方法的调用(我读取的是自动完成的,但我仍然想尝试),但这一切都没有任何影响-我的控制器仍然输出连接字符串,而实体框架核心的迁移仍然没有接收到它

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

根据我的评论

此外,如果希望绕过变量设置,则需要查看上下文的
OnConfiguring
方法重载,并在传入的DbOptions参数上使用
IsConfigured
标志,以便在没有有效配置传递到上下文时仅从文件读取


我应该警告说,当其他开发人员使用该解决方案时,这也会导致问题,而且,您不应该将读取的文件检查到公共源代码管理存储库中,因为这是人们获取他们不应该获得的凭据的一种方式,请首先查看环境变量是否存在?不要使用一行程序s、 将env变量值存储在临时变量中并调试代码。异常表明它为null,这意味着在运行此代码时未设置该值。顺便说一句,这与EF或EF迁移无关。甚至ASP.NET Core也没有,正如您直接调用的
Environment.GetEnvironmentVariable
。这意味着没有
连接_STRING
environment variable。正确的方法是在.NET Core中使用环境变量,通常是使用,它允许您将EF等服务与配置源分离,并通过文件、数据库、cli或环境变量提供设置谢谢您的回答,我将阅读更多文章e您链接并将尝试实现这些内容并进行更多调试。我将在完成后发布更新。我的主要观点是目前没有此类环境变量。您设置了它吗?您是如何测试代码的?