共用方式為


教學課程:第 5 部分,將移轉套用至 Contoso 大學範例

在本教學課程中,您會開始使用 EF Core 移轉功能來管理數據模型變更。 在稍後的教學課程中,您會在變更數據模型時新增更多移轉。

在本教學課程中,您會:

  • 瞭解移轉
  • 建立初始移轉
  • 檢查向上和向下方法
  • 了解數據模型快照集
  • 套用移轉

Prerequisites

About migrations

在開發新的應用程式時,您的資料模型會頻繁變更,而每次模型變更時,模型會與資料庫不同步。 您已設定 Entity Framework,以在資料庫不存在時建立資料庫,來啟動這些教學課程。 然後,每次您變更數據模型 -- 新增、移除或變更實體類別或變更 DbContext 類別時,您都可以刪除資料庫,EF 會建立符合模型的新模型,並將它植入測試數據。

在您將應用程式部署到生產環境之前,都可以使用上述方法讓資料庫與資料模型保持同步。 當應用程式在生產環境中執行時,通常會儲存您想要保留的數據,而且您不想在每次進行變更時遺失所有專案,例如新增數據行。 移 EF Core 轉功能可藉由讓EF更新資料庫架構,而不是建立新的資料庫,來解決此問題。

若要使用移轉,您可以使用 套件管理員主控台 (PMC) 或 CLI。 這些教學課程示範如何使用 CLI 命令。 PMC 的相關信息在本 教學課程結束時

卸除資料庫

將工具安裝 EF Core 為 全域工具 ,並刪除資料庫:

dotnet tool install --global dotnet-ef
dotnet ef database drop

Note

根據預設,要安裝的 .NET 二進位檔架構代表目前執行的 OS 架構。 若要指定不同的 OS 架構,請參閱 dotnet tool install, --arch option。 如需詳細資訊,請參閱 GitHub 問題 dotnet/AspNetCore.Docs #29262

下一節說明如何執行 CLI 命令。

建立初始移轉

儲存您的變更並建置專案。 然後開啟命令視窗並瀏覽至項目資料夾。 以下是執行此動作的快速方法:

  • [方案總管] 中,以滑鼠右鍵按兩下專案,然後從作功能表中選擇 [ 在檔案總管中開啟資料夾 ]。

    在 [檔案總管] 功能表項中開啟

  • 在網址列中輸入 「cmd」,然後按 Enter。

    開啟命令視窗

在指令視窗中輸入下列命令:

dotnet ef migrations add InitialCreate

在上述命令中,會顯示類似下列的輸出:

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
Done. To undo this action, use 'ef migrations remove'

如果您看到錯誤訊息「無法存取檔案...ContosoUniversity.dll,因為它正由另一個進程使用。」,請在 Windows 系統匣中尋找 IIS Express 圖示,然後以滑鼠右鍵按鍵按下它,然後按下 [ContosoUniversity > Stop Site]。

檢查向上和向下方法

當您執行 migrations add 命令時,EF 會產生會從頭開始建立資料庫的程序代碼。 此程式代碼位於 [ 移轉] 資料夾中,位於名為 <timestamp>_InitialCreate.cs的檔案中。 類別 UpInitialCreate 方法會建立對應至數據模型實體集的資料庫數據表,而 Down 方法會加以刪除,如下列範例所示。

public partial class InitialCreate : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Course",
            columns: table => new
            {
                CourseID = table.Column<int>(nullable: false),
                Credits = table.Column<int>(nullable: false),
                Title = table.Column<string>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Course", x => x.CourseID);
            });

        // Additional code not shown
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Enrollment");
        // Additional code not shown
    }
}

Migrations 會呼叫 Up 方法,以實作移轉所需的資料模型變更。 當您輸入命令以復原更新時,Migrations 會呼叫 Down 方法。

此程式代碼適用於您輸入 migrations add InitialCreate 命令時所建立的初始移轉。 移轉名稱參數 (範例中的 “InitialCreate”) 用於檔名,而且可以是您想要的任何專案。 最好選擇一個單字或片語,以摘要說明在移轉中執行的動作。 例如,您可以將稍後的移轉命名為 "AddDepartmentTable"。

如果在您建立初始移轉時資料庫已經存在,系統會產生資料庫建立程式碼,但不需要執行,因為資料庫已經符合資料模型。 當您將應用程式部署到資料庫尚未存在的其他環境中時,即會執行這個程式碼以建立您的資料庫;建議您先進行測試。 這就是為什麼您先前卸除資料庫的原因,讓移轉可以從頭開始建立新的資料庫。

數據模型快照集

移轉會在 中Migrations/SchoolContextModelSnapshot.cs建立目前資料庫架構的快照集。 當您新增移轉時,EF 會藉由比較數據模型與快照集檔案來判斷變更的專案。

使用 dotnet ef migrations remove 命令來移除移轉。 dotnet ef migrations remove 會刪除移轉,並確保快照集已正確重設。 如果 dotnet ef migrations remove 失敗,請使用 dotnet ef migrations remove -v 取得失敗的詳細資訊。

如需如何使用快照集檔案的詳細資訊,請參閱 EF Core Team Environment中的移 轉。

套用移轉

在命令視窗中,輸入下列命令,以在其中建立資料庫和數據表。

dotnet ef database update

命令的輸出類似於 migrations add 命令,不同之處在於您會看到設定資料庫的 SQL 命令記錄。 下列範例輸出會省略大部分的記錄。 如果您不想在記錄訊息中看到此層級的詳細數據,您可以變更檔案中的 appsettings.Development.json 記錄層級。 如需詳細資訊,請參閱 在 .NET 和 ASP.NET Core 中記錄

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (274ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
      CREATE DATABASE [ContosoUniversity2];
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (60ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
      IF SERVERPROPERTY('EngineEdition') <> 5
      BEGIN
          ALTER DATABASE [ContosoUniversity2] SET READ_COMMITTED_SNAPSHOT ON;
      END;
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (15ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      CREATE TABLE [__EFMigrationsHistory] (
          [MigrationId] nvarchar(150) NOT NULL,
          [ProductVersion] nvarchar(32) NOT NULL,
          CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
      );

<logs omitted for brevity>

info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])
      VALUES (N'20190327172701_InitialCreate', N'5.0-rtm');
Done.

使用 SQL Server 物件總 管來檢查資料庫,如同您在第一個教學課程中所做的一樣。 您會注意到新增__EFMigrationsHistory數據表,以追蹤哪些移轉已套用至資料庫。 檢視該資料表中的數據,您會看到第一個移轉的一個數據列。 (上述 CLI 輸出範例中的最後一個記錄會顯示建立此數據列的 INSERT 語句。

執行應用程式以確認所有專案仍然與之前相同。

Students [索引] 頁面

比較 CLI 和 PMC

管理移轉的 EF 工具可從 .NET CLI 命令或 Visual Studio 套件管理員控制台 (PMC) 視窗中的 PowerShell Cmdlet 取得。 本教學課程示範如何使用 CLI,但如果您想要的話,可以使用 PMC。

PMC 命令的 EF 命令位於 Microsoft.EntityFrameworkCore.Tools 套件中。 此套件包含在 Microsoft.AspNetCore.App 中繼套件中,因此如果您的應用程式具有的 Microsoft.AspNetCore.App套件參考,則不需要新增套件參考。

重要: 這與您為 CLI 安裝的套件不同,方法是編輯 .csproj 檔案。 這個名稱以 結尾 Tools,不同於以 結尾的 Tools.DotNetCLI 套件名稱。

如需 CLI 命令的詳細資訊,請參閱 .NET CLI

如需 PMC 命令的詳細資訊,請參閱 套件管理員主控台 (Visual Studio)

取得程式碼

下載或檢視已完成的應用程式。

Next step

前進到下一個教學課程,開始查看有關擴充數據模型的更進階主題。 一路上,您將建立並套用其他移轉。