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());
}
}