C# 为什么在这个实例中,为更新数据库生成的代码第一次迁移被破坏了?
我将我的一个实体从UploadedFile重命名为File,并执行了C# 为什么在这个实例中,为更新数据库生成的代码第一次迁移被破坏了?,c#,entity-framework,ef-code-first,entity-framework-6,entity-framework-migrations,C#,Entity Framework,Ef Code First,Entity Framework 6,Entity Framework Migrations,我将我的一个实体从UploadedFile重命名为File,并执行了添加迁移,结果如下: public override void Up() { RenameTable(name: "dbo.UploadedFiles", newName: "Files"); DropPrimaryKey("dbo.UploadedFiles"); AddColumn("dbo.Files", "FileId", c => c.Int(nul
添加迁移
,结果如下:
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");
}
之后,我执行了一个更新数据库
,发现迁移将失败。我不得不重新整理其中的两份声明以使其生效
DropPrimaryKey
必须在RenameTable
之前,因为生成的代码引用了旧表名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");
我是否需要手动编辑这些生成的迁移,或者我是否做错了影响生成的事情?
一次更改表名和主键的次数太多了,我应该在每个步骤执行
添加迁移吗?这听起来像是个bug,我建议您这样做。在创建迁移时,EF似乎无法确定哪个语句具有更高的优先级
当然,如果您使用在表上简单命名PKId
的约定,您将完全避免这个问题。我通常认为这更具可读性,因为它防止PKs与FKs混合(例如Id
和OwnerId
vsFileId
和OwnerId
)