EF - 从AutomaticMigrations迁移到手动迁移

时间:2013-11-20 00:43:19

标签: entity-framework ef-migrations

测试各种场景的漫长的一天,我不必重新创建生产数据库......

我们从EF开始,在开发过程中没有足够明智地从自动迁移转移到命名迁移。现在我正在尝试倒回时钟,并创建一个与生产数据库对齐的初始迁移。

  1. 是否可以将模型与迁移表中的自动迁移对齐?
  2. 我应该创建一个空迁移来开始命名迁移吗?我唯一的问题是如何在新的开发人员加入时创建数据库...我可以简单地恢复数据库,然后应用迁移,但这会破坏美丽的EF迁移故事!
  3. 删除生产数据库,创建并编写脚本以重新导入数据(听起来很糟糕)。
  4. 另一个皱纹 - 数据库是用EF5创建的,我们现在正在开发EF6。

    提前感谢您的帮助。

2 个答案:

答案 0 :(得分:11)

应该可以:

  1. 删除__MigrationHistory表
  2. 删除项目中的所有迁移
  3. 在迁移配置类中禁用自动迁移
  4. 添加迁移InitialCreate
  5. Update-Database -Script
  6. 执行创建__MigrationHistory表的脚本部分并在其中插入一行
  7. 重复步骤1& 6对于任何其他现有数据库
  8. 我还强烈建议您阅读Code First Migrations in Team Environments

答案 1 :(得分:6)

如果你不喜欢布里斯拉姆的第7步答案。然后继续阅读。

因为从自动迁移升级到手动也可以自动化。而且你不需要像bricelam那样删除迁移历史表。

在这种情况下,我假设您有一台开发机器和多台其他(开发)机器,其中已存在数据库。

  1. 在您的开发机器上,您将数据库移动到一个安全的位置(保证测试您的自动升级过程是安全的)。 (您可能希望确保您的代码与要升级的所有数据库处于完全相同的状态)。

  2. 删除项目中的所有迁移(您还没有任何迁移)

  3. 在迁移配置类中禁用自动迁移

  4. Add-Migration InitialCreate

  5. 将数据库的备份(副本!)放回原位

  6. 在启动应用程序(或升级应用程序)时,您会执行以下操作:

        using (var db = new YourDatabaseContext())
        {
            InitialCreate.SkipInitialCreate = db.Database.Exists();
        }
    
  7. 在您的InitialCreate中添加如下内容:

        public static bool SkipInitialCreate = false;
    
        public override void Up()
        {
            // Skip initial create
            if (SkipInitialCreate)
                return;
    

    这假设如果存在数据库,它的结构与您在开发机器上的结构相同。当然,这可能比对你来说更复杂。要获得更多控制,您可以检查配置的DbMigrator对象,并跳过多个迁移。 (如果您可以在DbMigrator中查询模型的哈希值,那会很好......)

    1. 在步骤4中的代码之后添加如下内容:

          var configuration = new YourDatabaseConfiguration();
          var migrator = new DbMigrator(configuration);
          migrator.Update();
      
    2. 在您的开发计算机上启动您的应用程序以测试升级。您的历史记录表应具有自动移民记录和初始创建记录。

    3. 如果一切正常,您应该能够在数据库已经存在的机器上简单地部署和运行应用程序。

    4. 一个非常重要的方面(也许是bricelam说您需要删除历史记录表的原因)是,如果该表中的AutomaticMigration记录比您的一个手动迁移更新,那么您将会遇到错误的时间。因为迁移器使用日期来整理它需要做的工作。

      因此,如果有系统仍然自动升级到最新的自动升级模型,那么你有点腌渍。