dotnet ef迁移自动化:检测迁移的变化

时间:2017-07-16 21:39:39

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

我使用以下CLI进行数据库迁移:

  1. dotnet ef migrations add <Name-of-Migration>
  2. dotnet ef database update
  3. 但是,我正在寻找一种自动发生的方法:当检测到模型发生变化时。

    到目前为止,我已经能够通过在Startup.cs中执行以下操作来消除步骤2:

     private void SetupDatabase(IApplicationBuilder app)
        {
            using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
            {
                var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
                //Migate any pending changes:
                context.Database.Migrate();
            }
        }
    

    这会迁移通过执行以下操作创建的所有待处理更改: dotnet ef migrations add <Name-of-Migration> 但它不会为模型中的任何更改添加迁移。如何自动执行此migrations add

2 个答案:

答案 0 :(得分:11)

<强>更新: 可以从代码中自动生成迁移的第一步,这是我个人不同意的设计决策。我的目标EF7仍然不可能像我最初所说的那样(它已经从EF7中删除了,如{I 3所提到的那样in this SO post以及this blog post中提到的member of Microsoft EF team ,但在Martin回复后在EF6中测试过。第二步可以自动进行,因为你已经发现了,所以我不会再次重现它。

第一步的步骤如下(在带有EF6的ASP.net MVC Web应用程序中):

  1. 在您的项目中(应该已经与某些模型一起运行并处于一致状态),转到包管理器控制台并运行Enable-Migrations –EnableAutomaticMigrations。如果您的应用程序具有单个数据库上下文,则它也在那里应用了更改。
  2. 现在转到现有模型并在那里添加一个新字段,例如public String TestField { get; set; }
  3. 由于代码第一次自动迁移是 ON ,您不需要再次运行Add-Migration命令(希望如我在本答案的后面部分所指出的那样),您只需运行{ {1}}并且应该更新数据库,以使您的应用程序正常运行。
  4. 为什么自动模型更改监控自动生成和更新数据库有时可能适得其反(以我的拙见和MSDN page):

    • 根据MSDN,自动迁移在更改字段重命名时不起作用。
    • 如果添加了原始字段类型,则需要考虑现有数据,您应该考虑在此方案中进行手动迁移。
    • 您可以散布自动和基于代码的迁移,但在团队开发方案中不建议这样做。如果您是使用源代码管理的开发人员团队的一员,则应使用纯自动迁移或纯粹基于代码的迁移。鉴于自动迁移的限制,MSDN建议在团队环境中使用基于代码的迁移。
    • 很好地确认模型更改是故意的,并且在进行更改时不是某些剩余代码的结果,可能发生的事情以及自动化整个过程可能会将这些更改传递给DB。
    • 由于某些数据限制或类似问题,生成的迁移并不总是优化和/或失败,因此应进行审核。
    • 在某些情况下,当迁移处理的数据量很大时,甚至更新数据库也已暂停生产数据。然后我们必须手动远程运行它并重新启动服务器。

    上述内容可能并不适用于所有人,但我认为应该分享我同意设计决策的原因,即不将迁移生成和应用程序自动化生成数据库。

    考虑启用自动迁移的每个人都应该阅读MSDN page了解更多示例和缺点。

答案 1 :(得分:6)

Entity Framework 4.3 has introduced the Automated Migrations

虽然我同意哈桑的回答,说明这可能非常棘手,但这个选项确实存在。

这是一份简短的简历:

  1. 启用迁移时,必须在程序包管理器控制台中提供参数:
  2.   

    enable-migrations -EnableAutomaticMigration:$ true

    1. 将自动生成配置类:

      public Configuration()
      {
          AutomaticMigrationsEnabled = true;
      
          //Set this parameter to true if you want to let auto-migration delete data when a property is removed from an entity.
          //Not setting this will result in an exception when migration should remove a column.
          AutomaticMigrationDataLossAllowed = true;
      }
      
    2. 在Context类中设置DB Initializer

      Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDBContext, MyConfigurationClass>("MyConnectionString"));
      
    3. 然后你去,改变模型,看看变化......

      我仍然不确定我会使用它,因为我希望我的数据库在我这么说时改变...