[英]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
之前,因为生成的代码引用了旧表名 AddColumn
之前执行DropColumn
,否则将引发多个标识列错误。 结果就是这样,它按预期方式工作;
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");
是否期望我需要手动编辑这些生成的迁移,或者我做错了什么会影响生成?
一次更改表名和主键是否过多,我是否应该在每个步骤中执行一次Add-Migration
?
这听起来像是一个错误,我建议您在codeplex上创建一个问题 。 在创建迁移时,EF似乎无法确定哪个语句具有更高的优先级。
当然,如果使用仅在表上命名PK Id
的约定,则将完全避免此问题。 我通常发现它更具可读性,因为它可以防止PK与FK融合(例如Id
和OwnerId
与FileId
和OwnerId
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.