【问题标题】:why remove-migration run my app?为什么删除迁移运行我的应用程序?
【发布时间】:2018-02-07 01:31:54
【问题描述】:

我在上个月做了一些版本升级,现在我注意到当我使用“remove-migration”删除我恢复的迁移时,它首先运行我的应用程序。

(我注意到因为我们在启动时执行更新数据库,所以我遇到了无法删除迁移的情况,因为每次我尝试删除迁移时 - 它都会自动运行将迁移应用到 db 的启动,然后删除它失败,因为它在 db 中看到它。)

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    ASP.NET Core 2.1 更新

    在 ASP.NET Core 2.1 中,方法略有改变。通用方法与2.0类似,只是方法名和返回类型有所改变。

    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args)
            .Build()
            .Migrate();
    }
    
    public static IWebHostBuilder CreateWebHostBuilder(string[] args)
    {
        return new WebHostBuilder()
            ...; // Do not call .Build() here
    }
    

    ASP.NET Core 2.0

    如果您使用的是 ASP.NET Core 2.0/EF Core 2.0,则为了更好地覆盖此类情况,我们进行了更改,以便命令行工具可以更好地工作。

    this announcement 很好地涵盖了它。

    归结为有一个静态的BuildWebHost 方法来配置整个应用程序,但不运行它。

      public class Program
      {
          public static void Main(string[] args)
          {
              var host = BuildWebHost(args);
    
              host.Run();
          }
    
          // Tools will use this to get application services
          public static IWebHost BuildWebHost(string[] args) =>
              new WebHostBuilder()
                  .UseKestrel()
                  .UseContentRoot(Directory.GetCurrentDirectory())
                  .UseIISIntegration()
                  .UseStartup<Startup>()
                  .Build();
      }
    

    此外,对于 EF 2.0,现在建议在调用 BuildWebHost 之后将迁移移至 main 方法。例如

        public static void Main(string[] args)
        {
            var host = BuildWebHost(args)
                .Migrate();
    
            host.Run();
        }
    

    Migrate 是一个扩展方法:

    public static IWebHost Migrate(this IWebHost webhost)
    {
        using (var scope = webhost.Services.GetService<IServiceScopeFactory>().CreateScope())
        {
            using (var dbContext = scope.ServiceProvider.GetRequiredService<MyDbContext>()) 
            {
                dbContext.Database.Migrate();
            }
        }
        return webhost;
    }
    

    现在迁移仅在您的应用程序执行时运行。当您运行命令行工具时,只会调用 BuildWebHost 并且不会应用迁移。

    【讨论】:

    • 如果你直接复制粘贴代码sn-p,它是scope.ServiceProvider.GetRequiredService&lt;MyDbContext&gt;()
    • @emp 相同,参见stackoverflow.com/a/38704828/455493。只是方法名称发生了变化,返回类型从 IWebHost 到 IWebHostBuilder
    • @Tseng 哦,我明白了,需要在构建之后调用它,这也返回一个 IWebHost。感谢您的澄清!
    • @emp 新模式是在Main方法中调用.Build(),而不是在CreateWebHostBuilder中
    • @ElFik:因为它是一个控制台应用程序,所以你可以。尽管.GetAwaiter().GetResult() 总是更好,因为.Result 具有不同的异常行为(抛出AggregateException 而不是特定异常)。但是 C# 7.0 支持 async Main 方法,为什么不这样做,然后你可以等待它没有任何问题
    猜你喜欢
    • 2014-11-16
    • 2020-08-15
    • 2017-03-26
    • 1970-01-01
    • 2015-04-08
    • 2010-09-30
    • 2020-05-20
    • 2018-01-02
    • 2012-08-16
    相关资源
    最近更新 更多