在本教學課程中,您會開始使用 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的檔案中。 類別 Up 的 InitialCreate 方法會建立對應至數據模型實體集的資料庫數據表,而 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 語句。
執行應用程式以確認所有專案仍然與之前相同。
比較 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
前進到下一個教學課程,開始查看有關擴充數據模型的更進階主題。 一路上,您將建立並套用其他移轉。