实体框架迁移检测不存在的东西

本文关键字:不存在 检测 框架 迁移 实体 | 更新日期: 2023-09-27 18:05:44

我使用实体框架与代码优先的方法。

我创建了一个类,并将其映射为表:

modelBuilder.Entity<CdrFile>()
    .ToTable("cdrFile", schemaName)
    .HasKey(f => new { f.Id });

我创建我的迁移CdrFileMigration。这是最后一次迁移。

public override void Up()
{
    CreateTable(
        "administration.cdrFiles",
        c => new
            {
                id = c.Int(nullable: false, identity: true),
                name = c.String(),
                fileNameWithExtension = c.String(), // <-- See this line
                url = c.String(),
                serviceType = c.String(),
                date = c.DateTime(nullable: false),
                state = c.Int(nullable: false),
                operatorName = c.String(),
                acquisitionDate = c.DateTime(nullable: false),
            })
        .PrimaryKey(t => t.id);
}

然后我更新了数据库。一段时间过去了,我更改了实体CdrFile,删除了一列。在此期间没有创建迁移。所以我将数据库更新到最后一个之前的版本。我修改了CdrFileMigration,删除了列:

public override void Up()
{
    CreateTable(
        "administration.cdrFiles",
        c => new
            {
                id = c.Int(nullable: false, identity: true),
                name = c.String(),
                //fileNameWithExtension = c.String(), // <-- I removed this line
                url = c.String(),
                serviceType = c.String(),
                date = c.DateTime(nullable: false),
                state = c.Int(nullable: false),
                operatorName = c.String(),
                acquisitionDate = c.DateTime(nullable: false),
            })
        .PrimaryKey(t => t.id);
}

我再次将数据库更新到上次迁移。数据库是正确创建的,但是如果我再次运行Add-Migration命令,将生成以下文件

public partial class aa : DbMigration
{
    public override void Up()
    {
        DropColumn("administration.cdrFiles", "fileNameWithExtension");
    }
    public override void Down()
    {
        AddColumn("administration.cdrFiles", "fileNameWithExtension", c => c.String());
    }
}

为什么?我期望的是一个空的迁移。事实上,如果我运行这个迁移,我得到一个错误:"没有filenamewitheextension列drop found"…有人能帮帮我吗?

谢谢

实体框架迁移检测不存在的东西

问题是您在将数据库更新到上次版本后没有再次运行Add-Migration

EF在数据库中保存模型的快照。该快照在运行Add-Migration时更新。回到旧版本,只编辑旧的迁移文件是不够的。

要解决这个问题,使用Add-Migration创建一个空迁移。这将更新DB中的快照。例如,您可以在已经创建的迁移中删除DropColumn语句,然后删除Update-Database。如果再次运行Add-Migration,将不再生成DropColumn语句。

总结一下,编辑现有迁移的正确方法是:
  1. Update-Database -TargetMigration {Name of migration before migration to be edited}
  2. 删除要编辑的迁移文件(将UpDown的内容拷贝到废板上)
  3. 使用Add-Migration重新生成迁移。根据需要修改
  4. Update-Database应用迁移