【问题标题】:How to edit previously applied migration without adding another migration in EF code first如何在不首先在 EF 代码中添加另一个迁移的情况下编辑以前应用的迁移
【发布时间】:2014-03-23 23:41:03
【问题描述】:

我有一个使用“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”模式)。

模型更改保存在哪里?以及如何直接编辑源代码并重新应用迁移?我知道这是不可取的,因为这就是迁移的目的。但如果我只是处于早期开发阶段,我不想仅仅因为这些变化而弄脏我的历史。

【问题讨论】:

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


    【解决方案1】:

    TL;DR:这非常复杂 - 稍后添加新的迁移来解决问题要容易得多。

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

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

    这样做的唯一方法是回滚数据库并更新哈希。

    假设您应用了 3 个迁移:

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

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

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

    【讨论】:

    • 为了回滚到 Migration1,您应该执行 Update-Database -TargetMigration Migration1 -Force 我无法进行编辑,因为只有一个字符。
    【解决方案2】:

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

    1. 从 _MigrationHistory 表中删除迁移记录。找到“migrationId”与您的迁移类文件名匹配的那个,然后将其删除。
    2. 手动撤消之前迁移的所有更改(在添加新内容之前,这将是迁移类文件的 Down() 部分中的所有内容)。
    3. Update-Database(或您应用迁移所做的任何事情。我已打开自动迁移,所以我只运行我的应用程序)。

    我的迁移非常简单,所以我不确定这是否适用于所有人。

    享受吧!

    【讨论】:

    • 我认为您的答案是最好的,除了在开发环境之外更改迁移或在迁移已经提交之后是一个非常糟糕的主意。正确的方法是引入应用所需更改的新迁移。即使这只是一个错字。
    • 是的,它可以满足要求。与上述步骤一起需要完成的另一件事是从“ApplicationDbContextModelSnapshot”类中删除数据。我里面有数据,但是在创建新的迁移数据时没有显示出来,而且我也从数据库中删除了相关数据,所以我必须删除数据才能再次添加。这只是我的情况,但它可以帮助任何人。
    【解决方案3】:

    没有简单的方法可以做到这一点,但是,如果您使用的是版本控制系统(Git、Subversion 等),还有另一种选择。这有点麻烦,但它是唯一对我有用的。

    考虑到您有以下迁移:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 2017-07-20
      • 2015-04-29
      • 2017-01-31
      • 2023-01-01
      • 1970-01-01
      • 2012-08-20
      相关资源
      最近更新 更多