在迁移期间使用存储在环境变量中的数据库连接字符串
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
我有 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