C# 实体框架迁移检测不存在的内容

C# 实体框架迁移检测不存在的内容,c#,asp.net-mvc,entity-framework,entity-framework-migrations,C#,Asp.net Mvc,Entity Framework,Entity Framework Migrations,我使用的是实体框架和代码优先的方法 我创建了一个映射为表的类: modelBuilder.Entity<CdrFile>() .ToTable("cdrFile", schemaName) .HasKey(f => new { f.Id }); 然后我更新了数据库。 一段时间过去了,我更改了实体CdrFile删除了一列。 在此期间未创建任何迁移。因此,我将数据库更新为上次之前的版本。我修改了CdrFileMigration删除列: public overrid

我使用的是实体框架和代码优先的方法

我创建了一个映射为表的类:

modelBuilder.Entity<CdrFile>()
    .ToTable("cdrFile", schemaName)
    .HasKey(f => new { f.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);
}
为什么??我期望的是空迁移。事实上,如果我运行此迁移,我会得到一个错误:“找不到要删除的fileNameWithExtension列”。。。 有人能帮我吗


谢谢

问题是,在将数据库更新到上次版本后,您没有再次运行
添加迁移

EF在数据库中保留模型的快照。此快照在您运行
添加迁移时更新。仅返回旧版本并编辑旧迁移文件是不够的

要解决问题,请使用
添加迁移
创建空迁移。这将更新数据库中的快照。例如,您可以在已经创建的迁移中删除
DropColumn
语句,然后
updatedatabase
。如果随后再次运行
addmigration
,则不应再生成
DropColumn
语句

概括地说,编辑现有迁移的正确方法是:

  • 更新数据库-TargetMigration{要编辑的迁移前的迁移名称}
  • 删除要编辑的迁移文件(将
    向上
    向下
    的内容复制到废料垫)
  • 使用
    添加迁移
    再次生成迁移。根据需要修改
  • 更新数据库
    以应用迁移
  • 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);
    }
    
    public partial class aa : DbMigration
    {
        public override void Up()
        {
            DropColumn("administration.cdrFiles", "fileNameWithExtension");
        }
    
        public override void Down()
        {
            AddColumn("administration.cdrFiles", "fileNameWithExtension", c => c.String());
        }
    }