如何编辑以前应用的迁移,而不先在EF代码中添加其他迁移

时间:2014-02-22 08:19:09

标签: entity-framework ef-code-first entity-framework-6 ef-migrations

我使用“haward”数据库架构进行了应用迁移。

public partial class CreateCourseCategoryTable : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "haward.CourseCategories",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Name = c.String(),
                        Code = c.String(),
                    })
                .PrimaryKey(t => t.Id);
        }

        public override void Down()
        {
            DropTable("haward.CourseCategories");
        }
    }

使用此映射

public class CourseCategoryMapping : EntityTypeConfiguration<CourseCategory>
    {
        public CourseCategoryMapping()
        {
            ToTable("CourseCategories", "haward");
        }
    }

现在我想将架构从“haward”更改为“tr” 我不想用这个添加迁移,所以我想直接编辑迁移和映射的源代码。

public partial class CreateCourseCategoryTable : DbMigration
        {
            public override void Up()
            {
                CreateTable(
                    "tr.CourseCategories",
                    c => new
                        {
                            Id = c.Int(nullable: false, identity: true),
                            Name = c.String(),
                            Code = c.String(),
                        })
                    .PrimaryKey(t => t.Id);
            }

            public override void Down()
            {
                DropTable("tr.CourseCategories");
            }
        }


    public class CourseCategoryMapping : EntityTypeConfiguration<CourseCategory>
        {
            public CourseCategoryMapping()
            {
                ToTable("CourseCategories", "tr");
            }
        }

然后重新创建空数据库并发出命令update-database 但它告诉我还有待定的更改。

所以我所做的是发出add-migration命令来检查那些更改。即使没有迁移表,它似乎仍然可以检测到我的编辑(从“haward”到“tr”模式)。

保存模型更改的位置?以及如何直接编辑源代码并重新应用迁移?我知道它不可取,因为这就是迁移的目的。但是如果我只是处于早期开发阶段,我不想特意将这些变化弄得一团糟。

3 个答案:

答案 0 :(得分:17)

TL; DR:这非常复杂 - 以后添加新迁移以解决问题会更容易。

实体框架迁移由两部分组成 - 代码和模型的哈希。模型的哈希用于确定模型是否已更改,因此是否需要任何新的迁移。

如果更改模型,则更改哈希值。此哈希存储在MigrationName.designer.cs文件中。您不能只编辑模型并更改migration.cs代码,因为模型不再与模型哈希匹配。您还需要为模型重新生成哈希值。

执行此操作的唯一方法是回滚数据库,并更新哈希值。

考虑您已应用3次迁移:

  • Migration1
  • Migration2
  • Migration3

如果您想从Migration2开始应用更改......

  • 回滚到Migration1:Update-Database -TargetMigration Migration1 -Force(注意 - 这可能会导致数据丢失,因此需要处理数据库的开发副本)
  • 使您的模型代码与您希望的迁移2匹配,并手动更新迁移2的代码
  • 为Migration2重新生成设计器文件:Add-Migration xxxxxxxxxxx_Migration2(使用迁移的全名,包括日期)。这只会更新designer.cs文件
  • 应用Migration2:Update-Database -TargetMigration Migration2
  • 对Migration3
  • 的代码重新应用任何模型更改
  • 重新生成Migration3的设计器文件:Add-Migration xxxxxxxxxxx_Migration3
  • 将数据库更新为最新版本:Update-Database

答案 1 :(得分:4)

我不确定这是否有助于其他人,但我可以通过执行以下操作来编辑和重新应用迁移:

  1. 从_MigrationHistory表中删除迁移记录。找到一个带有&#34; migrationId&#34;与您的迁移类文件名匹配并删除它。
  2. 在添加新内容之前,手动撤消所有以前的迁移更改(迁移类文件的Down()部分中的所有内容)。
  3. 更新 - 数据库(或您应用迁移所做的任何操作。我已启用自动迁移,因此我只运行我的应用)。
  4. 我的迁移非常简单,所以我不确定这是否适合所有人。

    享受!

答案 2 :(得分:0)

没有简便的方法,但是,如果您使用的是版本控制系统(Git,Subversion等),则还有另一种选择。有点辛苦,但它是唯一对我有用的。

考虑到您进行了以下迁移:

  • 迁移1
  • 迁移2
  • 迁移3

假设您要更改 Migration2 ,可以按照以下步骤操作:

  1. 使用要应用于 Migration2
  2. 的更改创建补丁
  3. 在要避免迁移之前立即检查提交(在这种情况下,为Migration3-看起来就像您刚刚创建了Migration2)
  4. 将数据库更新为 Migration1 -Update-Database -TargetMigration Migration1 -Force
  5. 应用您在第1步中创建的补丁
  6. 重新创建 Migration2 -Add-Migration Migration2(现在它将完全包含您想要的更改)
  7. 将创建的迁移文件复制到其他目录
  8. 还原所有未提交的更改
  9. 再次签出HEAD提交
  10. 删除 Migration2 Migration3
  11. 的文件
  12. 将第6步中的文件复制回其原始目录
  13. 更新数据库-Update-Database
  14. 重新创建 Migration3 -Add-Migration Migration3
  15. 再次更新数据库-Update-Database