运行Entity Framework Core代码优先的Add-Migration命令时,如何执行代码?

问题描述 投票:0回答:1

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

为了澄清这个理由,下面是我要完成的事情。

在我的Visual Studio解决方案中,我也有一个docker -compose项目。我使用一个.env文件(所以它可以被添加到.gitignore)来填充环境。我想使用相同的.env文件来设置.NET项目的环境,以避免在例如appsettings文件中出现重复的条目。我找到了一个Nuget包,它可以很好地在启动时加载.env文件,这样代码方面就有了保障。问题是,当我尝试添加迁移时,我无法运行这个包来导入包含连接字符串数据的.env文件,所以迁移添加失败。

asp.net-core .net-core entity-framework-core ef-migrations
1个回答
0
投票

多亏了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>();
    }
© www.soinside.com 2019 - 2024. All rights reserved.