チュートリアル: パート 5 - Contoso University のサンプルに移行を適用する

このチュートリアルでは、データ モデルの変更を管理するための EF Core の移行機能の使用を開始します。 チュートリアルの後半では、データ モデルを変更するときに移行を追加します。

このチュートリアルでは、次の作業を行いました。

  • 移行について学習する
  • 初期移行を作成する
  • Up および Down メソッドを確認する
  • データ モデルのスナップショットについて学習する
  • 移行を適用する

必須コンポーネント

移行について

新しいアプリケーションを開発して、データ モデルが頻繁に変更される場合、モデルが変更されるたびに、モデルはデータベースと同期されなくなります。 データベースが存在しない場合にデータベースを作成するように Entity Framework を構成して、これらのチュートリアルを開始しました。 そのため、データ モデルを変更する (エンティティ クラスを追加、削除、または変更するか、DbContext クラスを変更する) たびに、データベースを削除することができ、EF でモデルに一致する新しいデータベースを作成し、テスト データを使ってシードを設定します。

このメソッドは、実稼働環境にアプリケーションを展開するまで、データベースとデータ モデルの同期の維持がうまく機能します。 実稼働環境でアプリケーションを実行している場合、通常、保持する必要があるデータが保存され、新しい列の追加などの変更を加えるたびにすべてが失われないようにする必要があります。 EF Core の移行機能は、新しいデータベースを作成する代わりに、EF でデータベース スキーマを更新できるようにすることで、この問題を解決します。

移行の作業を行うには、パッケージ マネージャー コンソール (PMC) または CLI を使用できます。 このチュートリアルでは、CLI コマンドを使用する方法を示します。 PMC については、このチュートリアルの最後に説明します。

データベースを削除します。

EF Core ツールをグローバル ツールとしてインストールし、データベースを削除します。

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

次のセクションでは、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 では最初からデータベースを作成するコードが生成されています。 このコードは、Migrations フォルダーの <timestamp>_InitialCreate.cs という名前のファイル内にあります。 InitialCreate クラスの Up メソッドでは、データ モデルのエンティティ セットに対応するデータベース テーブルを作成し、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 メソッドを呼び出して、移行のためのデータ モデルの変更を実装します。 更新をロールバックするためのコマンドを入力すると、移行が Down メソッドを呼び出します。

このコードは、migrations add InitialCreate コマンドを入力したときに作成された初期移行向けのものです。 移行の name パラメーター (この例では "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

コマンドからの出力は、データベースを設定する SQL コマンドのログを表示する以外は、migrations add コマンドと同様です。 次のサンプル出力では、ログのほとんどは省略されています。 ログ メッセージの詳細レベルを表示しない場合は、appsettings.Development.json ファイルでログ レベルを変更できます。 詳細については、「.NET Core と 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 ステートメントを示しています)。

アプリケーションを実行して、すべてが以前と同じように動作することを確認します。

Students インデックス ページ

CLI と PMC を比較する

移行を管理するための EF ツールは、.NET Core CLI コマンドから、または Visual Studio パッケージ マネージャー コンソール (PMC) ウィンドウの PowerShell コマンドレットから利用できます。 このチュートリアルでは、CLI の使用方法を示しますが、好みに応じて PMC を使用できます。

PMC コマンドの EF コマンドは、Microsoft.EntityFrameworkCore.Tools パッケージ内にあります。 このパッケージは Microsoft.AspNetCore.App メタパッケージに含まれているので、アプリに Microsoft.AspNetCore.App のパッケージ参照がある場合、パッケージ参照を追加する必要はありません。

重要: これは、 .csproj ファイルを編集して CLI 用にインストールするものと同じパッケージではありません。 Tools.DotNet で終わる CLI パッケージ名とは異なり、このパッケージの名前は Tools で終わります。

CLI コマンドの詳細については、「.NET Core CLI」を参照してください。

PMC コマンドの詳細については、「パッケージ マネージャー コンソール (Visual Studio)」を参照してください。

コードを取得する

完成したアプリケーションをダウンロードまたは表示する。

次のステップ

データ モデルの展開に関するより高度なトピックを確認するには、次のチュートリアルに進んでください。 その途中で、追加の移行を作成して適用することになります。