运行 Entity Framework Core code-first Add-Migration 命令时如何执行代码?

How to execute code when running Entity Framework Core code-first Add-Migration command?

当我 运行 添加迁移命令时,我需要在 .NET Core 2.2 项目中 运行 一小段代码(从 .env 文件加载环境变量)。我的项目中是否有任何地方可以放置此代码,以便在创建迁移之前 运行s?我在某处读到 Startup.Configure 被执行,但事实并非如此。我需要在创建迁移时设置启动项目这一事实意味着某些东西正在执行。

为了阐明推理,以下是我要完成的工作:

在我的 Visual Studio 解决方案中,我还有一个 docker-compose 项目。我使用 .env 文件(因此可以将其添加到 .gitignore)来填充环境。我想使用相同的 .env 文件来设置 .NET 项目的环境,以避免在例如 appsettings 文件中重复条目。我发现了一个 Nuget 包,它非常适合在启动时加载 .env 文件,因此代码端被覆盖了。问题是,当我尝试添加迁移时,我无法 运行 此包导入包含连接字符串数据的 .env 文件,因此迁移添加失败。

多亏了 Fabio 上面的评论,我才能够从 Microsoft Docs 文章中找出我不知何故错过的解决方案。在我的例子中,我正在使用 IWebHostBuilder 创建应用程序。在这种情况下,迁移等设计时工具会调用 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>();
    }