【问题标题】:getting DesignTimeDbContextFactory to run migrations without executing Startup让 DesignTimeDbContextFactory 在不执行 Startup 的情况下运行迁移
【发布时间】:2021-01-02 09:24:18
【问题描述】:

在我的 ASP.Net 核心应用程序中,Startup 类有许多不需要进行迁移的东西。根据This,似乎我可以创建一个 DesignTimeFactory,它将准备指定的上下文并将其用于迁移目的。

所以我创建了实现 IDesignTimeDbContextFactory 的简单类,该类将简单地接受一个参数,对其进行一些处理,然后返回 MigrationContext 以在 CreateDbContext(string[] args) 中完成其余工作。

我的问题是当我从控制台运行 Add-Migration 命令时,它仍然执行 StartUp 类。 .我认为对于 DesignTimeFactory,它不应该尝试连接所有内容,而只需使用工厂返回的上下文并将其用于迁移目的。

有没有办法避免执行 Startup 类

       public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                Debugger.Launch();
                webBuilder.UseStartup<Startup>();
            });

并且仅仅依靠 DBContextFactory 进行迁移?所以 Startup 类只在运行时执行

【问题讨论】:

  • 您的类实现 IDesignTimeDbContextFactory 可能有问题,这会阻止 EF Core 查找/使用它。使用 -Verbose 选项运行 Add-Migration 并查看/发布输出。

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


【解决方案1】:

实际上,这已经在各个层面进行了讨论。见this thread

所以基本上我将 CreateHostBuilder(string[] args) 方法名称重命名为 PrepareHostBuilder(string[] args) 并且 DesignTimeFactory 停止尝试连接 Startup 的东西。 p>

在上面的网址中,对此进行了详细的讨论。

【讨论】:

    【解决方案2】:

    EF cli supports command line arguments 开始,一个 hack-ish 解决方法是将某种 arg 传递给 Add-Migration 或 Update-Database 命令,并在 CreateHostBuilder(string[] args) 方法中检查它是否存在:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>
        {
            if (!args.Contains("design"))
                webBuilder.UseStartup<Startup>();
        });
    

    然后您可以在 PackageManagerConsole 中调用以下命令跳过启动文件:

    PM> Update-Database -Context MyContext -Args "design"
    

    【讨论】:

      猜你喜欢
      • 2015-11-06
      • 1970-01-01
      • 2015-10-20
      • 2013-06-03
      • 1970-01-01
      • 2021-10-22
      • 2015-04-29
      • 1970-01-01
      • 2018-09-07
      相关资源
      最近更新 更多