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

标签 entity-framework ef-code-first entity-framework-6 entity-framework-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”模式)。

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

最佳答案

TL;博士:这非常复杂 - 稍后添加新迁移以纠正问题要容易得多。

Entity Framework 迁移由两部分组成 - 代码和模型的哈希。模型的散列用于确定模型是否已更改,从而确定是否需要进行任何新的迁移。

如果您更改模型,则会更改哈希。该哈希存储在 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 文件
  • 申请迁移2:Update-Database -TargetMigration Migration2
  • 将任何模型更改重新应用于 Migration3 的代码
  • 为 Migration3 重新生成设计器文件:Add-Migration xxxxxxxxxxx_Migration3
  • 将数据库更新到最新:Update-Database
  • 关于entity-framework - 如何编辑以前应用的迁移而不先在 EF 代码中添加另一个迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21951697/

    相关文章:

    asp.net - 如何使用 Entity Framework 数据库的 dbDacFx Web 部署提供程序?

    c# - 上传到托管服务器后 Entity Framework 连接错误

    entity-framework - EF : Validation failing on update when using lazy-loaded, 必需属性

    c# - "first time"a DbContext 到底是什么时候访问数据库的?

    c# - LINQ to Entities 中 Where 子句中的引号转义

    entity-framework - Entity Framework ObjectContext 是否正确实现了工作单元模式?

    entity-framework - 具有实体数据模型的 Active Directory

    c# - 无法向表中添加多个外键 - EF - Code First

    c# - 找不到方法 : 'Void System.Data.Entity.DbModelBuilder.RegisterEntityType(System.Type)'

    c# - 插入后获取实体导航属性