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

我使用“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”模式).

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

最佳答案
TL; DR:这非常复杂 – 以后添加新迁移以纠正问题要容易得多.

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

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

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

考虑您已应用3次迁移:

>迁移1
>迁移2
>迁移3

如果您想从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

转载注明原文:entity-framework – 如何编辑以前应用的迁移,而不先在EF代码中添加其他迁移 - 代码日志