为什么在这种情况下生成的 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,发现迁移会失败。我必须重新排序其中两个语句才能使其正常工作;

  1. DropPrimaryKey 需要在 RenameTable 之前,因为生成的代码引用了旧的 table 名称
  2. 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 混合(例如 IdOwnerIdFileIdOwnerId