このチュートリアルでは、データ モデルの変更を管理するための EF Core 移行機能の使用を開始します。 後のチュートリアルでは、データ モデルを変更するときに移行を追加します。
このチュートリアルでは、次の操作を行います。
- 移行について学ぶ
- 初期移行を作成する
- Up メソッドと Down メソッドを調べる
- データ モデルのスナップショットについて説明します
- 移行を適用する
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 ツールのインストール、--arch オプションを参照してください。 詳細については、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 > [サイトの停止] をクリックします。
Up メソッドと Down メソッドを調べる
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
}
}
移行では、 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の」を参照してください。
移行を適用する
コマンド ウィンドウで、次のコマンドを入力して、データベースとテーブルを作成します。
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 テーブルが追加されていることがわかります。 そのテーブルのデータを表示すると、最初の移行用に 1 つの行が表示されます。 (前の CLI 出力例の最後のログは、この行を作成する INSERT ステートメントを示しています)。
アプリケーションを実行して、すべてが以前と同じように動作することを確認します。
CLI と PMC の比較
移行を管理するための EF ツールは、.NET CLI コマンドから、または Visual Studio パッケージ マネージャー コンソール (PMC) ウィンドウの PowerShell コマンドレットから使用できます。 このチュートリアルでは CLI の使用方法を示しますが、必要に応じて PMC を使用できます。
PMC コマンドの EF コマンドは、 Microsoft.EntityFrameworkCore.Tools パッケージに含まれています。 このパッケージは Microsoft.AspNetCore.App メタパッケージに含まれているため、アプリに Microsoft.AspNetCore.App
のパッケージ参照がある場合は、パッケージ参照を追加する必要はありません。
大事な: これは、 .csproj
ファイルを編集して CLI 用にインストールするパッケージと同じパッケージではありません。 この名前は、Tools
で終わる CLI パッケージ名とは異なり、Tools.DotNet
で終わります。
CLI コマンドの詳細については、 .NET CLI を参照してください。
PMC コマンドの詳細については、「 パッケージ マネージャー コンソール (Visual Studio)」を参照してください。
コードを取得する
Next step
次のチュートリアルに進み、データ モデルの拡張に関するより高度なトピックを確認します。 その過程で、追加の移行を作成して適用します。
ASP.NET Core