簡體   English   中英

為什么在這種情況下為Update-Database破壞了生成的Code First遷移?

[英]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之前,因為生成的代碼引用了舊表名
  2. 必須在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融合(例如IdOwnerIdFileIdOwnerId

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM