【问题标题】:How to execute code when running Entity Framework Core code-first Add-Migration command?运行 Entity Framework Core 代码优先添加迁移命令时如何执行代码?
【发布时间】:2020-09-09 20:52:51
【问题描述】:

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

为了澄清推理,这是我想要完成的:

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

【问题讨论】:

  • 看起来像 XY 问题,您能解释一下为什么在添加迁移时需要运行一些代码吗?请注意,add-migration 只会生成一个迁移文件,您可以在之后对其进行修改(连同快照一起)
  • @Fabio 当然,我已经为我的问题添加了更多解释。
  • 添加迁移命令可以等到其他东西完成吗?
  • 取决于您如何创建 DbContext。对于复杂的情况,您可以实现IDesignTimeDbContextFactory。这是有关 EF 命令行工具如何实例化 DbContext docs.microsoft.com/en-us/ef/core/miscellaneous/cli/… 的更多详细信息的链接

标签: asp.net-core .net-core entity-framework-core entity-framework-migrations


【解决方案1】:

感谢上面 Fabio 的 cmets,我能够从我以某种方式错过的 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>();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2012-08-22
    • 2020-04-29
    • 1970-01-01
    相关资源
    最近更新 更多