Entity framework 如何编辑以前应用的迁移而不首先在EF代码中添加另一个迁移

Entity framework 如何编辑以前应用的迁移而不首先在EF代码中添加另一个迁移,entity-framework,ef-code-first,entity-framework-6,entity-framework-migrations,Entity Framework,Ef Code First,Entity Framework 6,Entity Framework Migrations,我有一个使用“haward”db模式的应用迁移 public partial class CreateCourseCategoryTable : DbMigration { public override void Up() { CreateTable( "haward.CourseCategories", c => new

我有一个使用“haward”db模式的应用迁移

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");
        }
    }
公共类课程类别映射:EntityTypeConfiguration
{
公共课程类别映射()
{
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");
            }
        }
public分部类CreateCourseCategoryTable:DbMigration
{
公共覆盖作废()
{
创建表(
“tr.CourseCategories”,
c=>新的
{
Id=c.Int(可为空:false,标识:true),
Name=c.String(),
Code=c.String(),
})
.PrimaryKey(t=>t.Id);
}
公共覆盖无效向下()
{
升降台(“tr.CourseCategories”);
}
}
公共类课程类别映射:EntityTypeConfiguration
{
公共课程类别映射()
{
ToTable(“课程分类”、“tr”);
}
}
然后重新创建空数据库并发出更新数据库命令 但它告诉我,我仍然有悬而未决的变化

因此,我所做的是发出addmigration命令来检查哪些更改是这些更改。即使没有migrations表,它似乎仍能检测到我的编辑(从“haward”模式到“tr”模式)


在哪里保存模型更改?如何直接编辑源代码并重新应用迁移?我知道这是不可取的,因为移民就是为了这个。但我不想因为这些变化而玷污我的历史,特别是如果我只是处于早期发展阶段的话;DR:这非常复杂-稍后只需添加一个新的迁移来纠正问题就容易多了

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

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

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

假设您应用了3次迁移:

  • 迁移1
  • 迁移2
  • 迁移3
如果要从Migration2开始应用更改

  • 回滚到迁移1:
    更新数据库-TargetMigration Migration1-Force
    (注意-这可能会导致数据丢失,因此请使用数据库的开发副本)
  • 使您的模型代码与迁移2所需的匹配,并手动更新迁移2的代码
  • 为迁移2重新生成设计器文件:
    添加迁移xxxxxxxxxx\u迁移2
    (使用迁移的全名,包括日期)。这将仅更新designer.cs文件
  • 应用迁移2:
    更新数据库-TargetMigration迁移2
  • 对迁移代码重新应用任何模型更改3
  • 为迁移3重新生成设计器文件:
    添加迁移xxxxxxxxxx\u迁移3
  • 将数据库更新为最新版本:
    更新数据库

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

  • 从_MigrationHistory表中删除迁移记录。找到与您的迁移类文件名匹配的“migrationId”并将其删除
  • 手动撤消以前迁移的所有更改(在添加新内容之前,这些更改将是迁移类文件的Down()部分中的所有内容)
  • 更新数据库(或应用迁移所做的任何操作。我已打开自动迁移,所以我只需运行我的应用程序) 我的迁移非常简单,所以我不确定这是否适用于所有人


    享受吧

    实现这一点没有简单的方法,但是,如果您使用的是版本控制系统(Git、Subversion等),那么还有另一种选择。这是一个有点辛苦,但是唯一一个为我工作

    考虑到您有以下迁移:

    • 迁移1
    • 迁移2
    • 迁移3
    假设您要更改迁移2,可以按照以下步骤操作:

  • 使用要应用于迁移的更改创建修补程序2
  • 在您想要避免的迁移之前立即签出提交(在本例中为Migration3-看起来您刚刚创建了Migration2)
  • 将数据库更新为Migration1-
    更新数据库-targetmigration1-Force
  • 应用在步骤1中创建的修补程序
  • 重新创建Migration2-
    添加Migration2
    (它现在将完全包含您想要的更改)
  • 将创建的迁移文件复制到其他目录
  • 还原所有未提交的更改
  • 再次检查头部提交
  • 删除迁移2和迁移3的文件
  • 将步骤6中的文件复制回其原始目录
  • 更新数据库-
    更新数据库
  • 重新创建迁移3-
    添加迁移3
  • 再次更新数据库-
    更新数据库
  • 我认为你的答案是正确的