簡體   English   中英

Add-Migration 命令使用什么來比較模式?

[英]What does Add-Migration command use to compare schemas?

我正在重命名幾個表和列。 由於我不想丟失現有數據,因此我從頭開始創建了遷移。

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.RenameTable(name: "Providers", schema: "dbo", newName: "Vendors", newSchema: "dbo");
    migrationBuilder.RenameTable(name: "ProviderContacts", schema: "dbo", newName: "VendorContacts", newSchema: "dbo");
    migrationBuilder.RenameColumn(name: "ProviderId", table: "AspNetUsers", newName: "VendorId", schema: "dbo");
    migrationBuilder.RenameColumn(name: "ProviderId", table: "VendorContacts", newName: "VendorId", schema: "dbo");
    migrationBuilder.RenameColumn(name: "ProviderId", table: "Locations", newName: "VendorId", schema: "dbo");
}

然后我運行了Update-Database 但這仍然留下一堆索引和外鍵也應該重命名。 所以我使用了Add-Migration命令來更新任何剩余的更改。

但是我注意到新的遷移似乎正在刪除並重新創建我的自定義遷移已經重命名的表和列。

migrationBuilder.DropTable(
    name: "ProviderContacts");

migrationBuilder.DropTable(
    name: "Providers");

migrationBuilder.DropIndex(
    name: "IX_Locations_ProviderId",
    table: "Locations");

migrationBuilder.DropIndex(
    name: "IX_AspNetUsers_ProviderId",
    table: "AspNetUsers");

migrationBuilder.DropColumn(
    name: "ProviderId",
    table: "Locations");

migrationBuilder.DropColumn(
    name: "ProviderId",
    table: "AspNetUsers");

我的問題是: Add-Migration命令比較的是什么? 它是在查看數據庫還是其他什么? 為什么它沒有認識到這些表和列已被重命名?

如何讓它識別我的自定義遷移中的更改?

在 EF Core 中, Update-Database使用IMigrationsAssembly服務來發現編譯到程序集中的遷移。 它使用另一個服務獲取已針對該數據庫運行的遷移列表。 隨着遷移的執行,遷移列表會在表中更新。 該過程不知道或不關心數據庫 model 的 state,它不會導致數據庫 model 發生任何變化。 該過程旨在針對其他數據庫工作,無需了解您的開發環境。

運行Add-Migration使用IMigrationsAssembly服務從您的上下文OnModelCreating方法加載已編譯到您的程序集中的先前ModelSnapshot和 model。 然后它使用IMigrationsModelDiffer服務兩次來比較兩個模型並生成 Up 和 Down 遷移例程。 然后將新的遷移和ModelSnapshot序列化回源代碼並寫入磁盤。 此過程對任何數據庫的 state 或之前遷移中的操作列表一無所知。

換句話說, Add-Migration並不關心您是否編寫了另一個遷移。 它仍然會比較這兩個模型。 遷移差異並不完美,如果前后表差異太大,則會生成刪除和創建步驟。

另一種選擇是一次執行一個更改,為每個步驟創建新的遷移。 然后將 Up & Down 方法合並到最后一個遷移中。 並刪除 rest。

EF 在將 C# model 與數據庫 model 進行比較時,不會使用您的實際數據庫架構或遷移文件的內容。

當您運行更新數據庫實體框架時,序列化您的 C# model 並將其存儲在 __MigrationHistory 表中。

您已更改 C# model 中的類的名稱,然后調用 Add-Migration,因此 EF 發現 model 已更改並創建遷移以進行更改。 如果您不喜歡它進行更改的方式,或者您需要更新數據以使遷移工作,您可以更改它創建的遷移。

因此,通常您不會在更改 C# 類之前創建初始遷移。 您應該首先更改 C# 類。 然后Add-Migration並更改生成的遷移,以便在調用Update-Database時重命名表而不是刪除它們

在您當前的情況下,您可以從第二次遷移中刪除 drop 和 recreate 語句,因為重命名已經發生

暫無
暫無

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

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