C# 为什么在这个实例中,为更新数据库生成的代码第一次迁移被破坏了?

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

我将我的一个实体从UploadedFile重命名为File,并执行了
添加迁移
,结果如下:

    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似乎无法确定哪个语句具有更高的优先级

    当然,如果您使用在表上简单命名PK
    Id
    的约定,您将完全避免这个问题。我通常认为这更具可读性,因为它防止PKs与FKs混合(例如
    Id
    OwnerId
    vs
    FileId
    OwnerId