我在一个.NET Core 2.2项目中需要在运行Add-Migration命令时运行一小段代码(从一个.env文件加载环境变量)。在我的项目中,有没有什么地方可以让我把这段代码放在创建迁移之前运行?我在某处读到Startup.Configure会被执行,但事实并非如此。事实上,我需要在创建迁移时设置启动项目,这意味着有些东西正在被执行。
为了澄清这个理由,下面是我要完成的事情。
在我的Visual Studio解决方案中,我也有一个docker -compose项目。我使用一个.env文件(所以它可以被添加到.gitignore)来填充环境。我想使用相同的.env文件来设置.NET项目的环境,以避免在例如appsettings文件中出现重复的条目。我找到了一个Nuget包,它可以很好地在启动时加载.env文件,这样代码方面就有了保障。问题是,当我尝试添加迁移时,我无法运行这个包来导入包含连接字符串数据的.env文件,所以迁移添加失败。
多亏了Fabio的上述评论,我能够从下面的文章中找出解决方案。Microsoft Docs 的文章,不知为何我错过了。在我的案例中,我是使用IWebHostBuilder创建应用程序。在这种情况下,像migrations这样的设计时工具会在Program.cs中调用CreateWebHostBuilder。为了从文件中加载我的环境变量,我不得不连锁调用ConfigureAppConfiguration,然后从我的.env文件中加载环境变量。是的,现在我有一个环境变量的地方,被Docker Compose和.NET项目使用。
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args).
ConfigureAppConfiguration((hostingContext, config) =>
{
// Load the contents of the .env file into the environment variables
// Necessary to do this in ConfigureAppConfiguration so design-time processes (eg. migrations) have the environment settings.
DotNetEnv.Env.Load("../../.env");
}).
ConfigureLogging((hostingContext, logging) =>
{
...
}).UseStartup<Startup>();
}