注
EF6 以降のみ - このページで説明されている機能、API などが Entity Framework 6 で導入されました。 以前のバージョンを使用している場合、一部またはすべての情報は適用されません。
注
この記事では、基本的なシナリオで Code First Migrations を使用する方法について説明します。 そうでない場合は、続行する前に Code First Migrations を読む必要があります。
移行履歴テーブルとは
移行履歴テーブルは、データベースに適用される移行に関する詳細を格納するために Code First Migrations によって使用されるテーブルです。 既定では、データベース内のテーブルの名前は__MigrationHistoryされ、データベースに最初の移行を適用するときに作成されます。 Entity Framework 5 では、アプリケーションが Microsoft Sql Server データベースを使用している場合、このテーブルはシステム テーブルでした。 これは Entity Framework 6 で変更されましたが、移行履歴テーブルはシステム テーブルとしてマークされなくなりました。
移行履歴テーブルをカスタマイズする理由
移行履歴テーブルは、Code First Migrations によってのみ使用され、手動で変更すると移行が中断される可能性があります。 ただし、既定の構成が適切ではなく、次のようにテーブルをカスタマイズする必要がある場合があります。
- サードパーティのマイグレーションプロバイダーを有効にするには、列の名前やファセットを変更する必要があります。
- テーブルの名前を変更する
- __MigrationHistory テーブルには既定以外のスキーマを使用する必要があります
- 特定のバージョンのコンテキストに対して追加のデータを格納する必要があるため、テーブルに列を追加する必要があります
予防の言葉
移行履歴テーブルの変更は強力ですが、やりすぎないように注意する必要があります。 EF ランタイムは現在、カスタマイズされた移行履歴テーブルがランタイムと互換性があるかどうかを確認しません。 アプリケーションでない場合は、実行時に中断したり、予期しない方法で動作したりする可能性があります。 これは、データベースごとに複数のコンテキストを使用する場合にさらに重要です。その場合、複数のコンテキストで同じ移行履歴テーブルを使用して移行に関する情報を格納できます。
移行履歴テーブルをカスタマイズする方法
開始する前に、最初の移行を適用する前にのみ、移行履歴テーブルをカスタマイズできることを知る必要があります。 次に、コードに。
まず、System.Data.Entity.Migrations.History.HistoryContext クラスから派生したクラスを作成する必要があります。 HistoryContext クラスは DbContext クラスから派生しているため、移行履歴テーブルの構成は、fluent API を使用した EF モデルの構成と非常によく似ています。 OnModelCreating メソッドをオーバーライドし、fluent API を使用してテーブルを構成するだけで済みます。
注
通常、EF モデルを構成する際、DbContext.OnModelCreating() には空の本文があるため、オーバーライドした OnModelCreating メソッドで base.OnModelCreating() を呼び出す必要はありません。 これは、移行履歴テーブルを構成する場合には当たりません。 この場合、OnModelCreating() オーバーライドで最初に行うことは、実際にベースを呼び出すことです。OnModelCreating(). これにより、移行履歴テーブルが既定の方法で構成され、その後、オーバーライドするメソッド内で調整することができます。
移行履歴テーブルの名前を変更し、"admin" という名前のカスタム スキーマに配置するとします。 さらに、DBA では MigrationId 列の名前を Migration_ID に変更する必要があります。 これを実現するには、HistoryContext から派生した次のクラスを作成します。
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Migrations.History;
namespace CustomizableMigrationsHistoryTableSample
{
public class MyHistoryContext : HistoryContext
{
public MyHistoryContext(DbConnection dbConnection, string defaultSchema)
: base(dbConnection, defaultSchema)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<HistoryRow>().ToTable(tableName: "MigrationHistory", schemaName: "admin");
modelBuilder.Entity<HistoryRow>().Property(p => p.MigrationId).HasColumnName("Migration_ID");
}
}
}
カスタム HistoryContext の準備ができたら、 コード ベースの構成を使用して登録して、EF に認識させる必要があります。
using System.Data.Entity;
namespace CustomizableMigrationsHistoryTableSample
{
public class ModelConfiguration : DbConfiguration
{
public ModelConfiguration()
{
this.SetHistoryContext("System.Data.SqlClient",
(connection, defaultSchema) => new MyHistoryContext(connection, defaultSchema));
}
}
}
以上です。 パッケージ マネージャー コンソール、Enable-Migrations、Add-Migration、最後に Update-Database に移動できるようになりました。 これにより、HistoryContext 派生クラスで指定した詳細に従って構成された移行履歴テーブルがデータベースに追加されます。
.NET