为什么在这种情况下生成的 Code First Migration 会因 Update-Database 而中断?
Why is the generated Code First Migration broken for Update-Database in this instance?
我将我的一个实体从 UploadedFile 重命名为 File 并执行了 Add-Migration
,结果如下;
public override void Up()
{
RenameTable(name: "dbo.UploadedFiles", newName: "Files");
DropPrimaryKey("dbo.UploadedFiles");
AddColumn("dbo.Files", "FileId", c => c.Int(nullable: false, identity: true));
AddPrimaryKey("dbo.Files", "FileId");
DropColumn("dbo.Files", "UploadedFileId");
}
之后我执行了一个Update-Database
,发现迁移会失败。我必须重新排序其中两个语句才能使其正常工作;
DropPrimaryKey
需要在 RenameTable
之前,因为生成的代码引用了旧的 table 名称
DropColumn
需要在 AddColumn
之前执行,否则会引发多标识列错误。
结果是这样的,符合预期;
DropPrimaryKey("dbo.UploadedFiles");
RenameTable(name: "dbo.UploadedFiles", newName: "Files");
DropColumn("dbo.Files", "UploadedFileId");
AddColumn("dbo.Files", "FileId", c => c.Int(nullable: false, identity: true));
AddPrimaryKey("dbo.Files", "FileId");
我是否需要手动编辑这些生成的迁移,还是我做错了什么影响了生成?
一次性更改 table 名称和主键是否过多,我是否应该在每一步都执行 Add-Migration
?
这听起来像是一个错误,我向您推荐 create an issue on codeplex。似乎 EF 在创建迁移时无法确定哪个语句具有更高的优先级。
当然,如果您使用在 table 上简单命名 PK Id
的惯例,您就可以完全避免这个问题。我通常发现这更具可读性,因为它可以防止 PK 与 FK 混合(例如 Id
和 OwnerId
与 FileId
和 OwnerId
)
我将我的一个实体从 UploadedFile 重命名为 File 并执行了 Add-Migration
,结果如下;
public override void Up()
{
RenameTable(name: "dbo.UploadedFiles", newName: "Files");
DropPrimaryKey("dbo.UploadedFiles");
AddColumn("dbo.Files", "FileId", c => c.Int(nullable: false, identity: true));
AddPrimaryKey("dbo.Files", "FileId");
DropColumn("dbo.Files", "UploadedFileId");
}
之后我执行了一个Update-Database
,发现迁移会失败。我必须重新排序其中两个语句才能使其正常工作;
DropPrimaryKey
需要在RenameTable
之前,因为生成的代码引用了旧的 table 名称DropColumn
需要在AddColumn
之前执行,否则会引发多标识列错误。
结果是这样的,符合预期;
DropPrimaryKey("dbo.UploadedFiles");
RenameTable(name: "dbo.UploadedFiles", newName: "Files");
DropColumn("dbo.Files", "UploadedFileId");
AddColumn("dbo.Files", "FileId", c => c.Int(nullable: false, identity: true));
AddPrimaryKey("dbo.Files", "FileId");
我是否需要手动编辑这些生成的迁移,还是我做错了什么影响了生成?
一次性更改 table 名称和主键是否过多,我是否应该在每一步都执行 Add-Migration
?
这听起来像是一个错误,我向您推荐 create an issue on codeplex。似乎 EF 在创建迁移时无法确定哪个语句具有更高的优先级。
当然,如果您使用在 table 上简单命名 PK Id
的惯例,您就可以完全避免这个问题。我通常发现这更具可读性,因为它可以防止 PK 与 FK 混合(例如 Id
和 OwnerId
与 FileId
和 OwnerId
)