我有一个ASP.NET Core项目,我在其中将PostgreSQL连接字符串存储在环境变量中。当我尝试进行初始迁移时,项目的构建成功,但是随后引发异常:
System.ArgumentNullException:值不能为null。 (参数'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);
}
}
任何帮助将不胜感激。
更新:我已经按照评论中的建议阅读了有关环境变量和配置的官方文档,并且通过使用一个方法创建了一个控制器来检查变量是否首先存在,该方法将返回如下连接字符串:
[HttpGet]
public string GetConnectionString()
{
return _config["CONNECTION_STRING"];
}
并且当我启动它时,正确的连接字符串确实会显示在浏览器中,但是当我尝试向数据库中添加初始迁移时,仍然会抛出我已经提到的异常。
我还尝试注释掉我的IDesignTimeDbContextFactory实现,并在Program.cs中手动添加对.AddEnvironmentVariables方法的调用(我已自动完成读取,但我仍想尝试),但是这些都没有效果-当Entity Framework Core的迁移仍未收到连接字符串时,我的控制器仍发出连接字符串。
总之,是的,存在连接字符串,我什至可以输出它,但是由于相同的异常,迁移仍然失败。
根据我的评论。
请参见Command Line Environment Variables
此外,如果要绕过变量的设置,则需要查看Context的OnConfiguring
方法重载,并在传入的DbOptions参数上使用IsConfigured
标志,以仅从文件读取当没有有效的配置传递给上下文时。