Entity Framework 迁移检测到不存在的东西
Entity Framework migration detect something that not exists
我正在使用 Entity Framework 代码优先方法。
我创建了一个 class 映射为 table:
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());
}
}
为什么?我期待一个空的迁移。事实上,如果我 运行 此迁移,我得到一个错误: "No fileNameWithExtension column to drop found"...
谁能帮帮我?
谢谢
问题是你更新数据库到上次之前的版本后,没有再运行Add-Migration
EF 在数据库中保留模型的快照。此快照会在您 运行 Add-Migration
时更新。返回旧版本并仅编辑旧迁移文件是不够的。
要解决您的问题,请使用 Add-Migration
创建一个空迁移。这将更新数据库中的快照。例如,您可以只删除已创建的迁移中的 DropColumn
语句,然后删除 Update-Database
。如果您随后再次 运行 Add-Migration
,则不应再生成 DropColumn
语句。
概括地说,编辑现有迁移的正确方法是:
Update-Database -TargetMigration {Name of migration before migration to be edited}
- 删除要编辑的迁移文件(将
Up
和Down
的内容复制到剪贴簿)
- 使用
Add-Migration
再次生成迁移。根据需要修改。
Update-Database
应用迁移
我正在使用 Entity Framework 代码优先方法。
我创建了一个 class 映射为 table:
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());
}
}
为什么?我期待一个空的迁移。事实上,如果我 运行 此迁移,我得到一个错误: "No fileNameWithExtension column to drop found"... 谁能帮帮我?
谢谢
问题是你更新数据库到上次之前的版本后,没有再运行Add-Migration
EF 在数据库中保留模型的快照。此快照会在您 运行 Add-Migration
时更新。返回旧版本并仅编辑旧迁移文件是不够的。
要解决您的问题,请使用 Add-Migration
创建一个空迁移。这将更新数据库中的快照。例如,您可以只删除已创建的迁移中的 DropColumn
语句,然后删除 Update-Database
。如果您随后再次 运行 Add-Migration
,则不应再生成 DropColumn
语句。
概括地说,编辑现有迁移的正确方法是:
Update-Database -TargetMigration {Name of migration before migration to be edited}
- 删除要编辑的迁移文件(将
Up
和Down
的内容复制到剪贴簿) - 使用
Add-Migration
再次生成迁移。根据需要修改。 Update-Database
应用迁移