次の方法で共有


migrate.exe を使用する

Code First Migrations は、データベースを更新する際に Visual Studio 内から使用できますが、コマンド ライン ツールの migrate.exe から実行することもできます。 このページでは、migrate.exe を使用してデータベースに対する移行を実行する方法について概説します。

Note

この記事は、読者が基本的なシナリオでの Code First Migrations の使用方法を理解していると想定しています。 それ以外の方は、先に「Code First Migrations」をお読みください。

migrate.exe をコピーする

NuGet を使用して Entity Framework をインストールした場合、migrate.exe は、ダウンロードされたパッケージの tools フォルダー内にあります (<project folder>\packages\EntityFramework.<version>\tools)。

migrate.exe を入手したら、実際の移行内容を含んでいるアセンブリの場所にそれをコピーします。

加えて、アプリケーションが .NET 4.5 ではなく .NET 4 を対象としている場合は、その場所に Redirect.config もコピーし、その名前を migrate.exe.config に変更する必要があります。これは、migrate.exe が正しいバインディング リダイレクトを取得して、Entity Framework アセンブリを特定できるようにするためです。

.NET 4.5 .NET 4.0
.NET 4.5 Files .NET 4.0 Files

Note

migrate.exe は x64 のアセンブリをサポートしません。

migrate.exe を適切なフォルダーに移動すると、それを使用してデータベースに対する移行を実行できるようになります。 このユーティリティは、移行を実行するためだけに設計されています。 移行を生成したり、SQL スクリプトを作成したりすることはできません。

オプションを表示する

Migrate.exe /?

上のコマンドを実行すると、このユーティリティに関連付けられているヘルプ ページが表示されます。ただしそのためには、migrate.exe が実行されている同じ場所に EntityFramework.dll が格納されている必要があります。

最新の移行にまで移行する

Migrate.exe MyMvcApplication.dll /startupConfigurationFile="..\\web.config"

migrate.exe を実行するときの唯一の必須パラメーターはアセンブリ (実行しようとしている移行を含んでいるアセンブリ) です。構成ファイルを指定しなかった場合は、規約に基づくすべての設定が使用されます。

特定の移行にまで移行する

Migrate.exe MyApp.exe /startupConfigurationFile="MyApp.exe.config" /targetMigration="AddTitle"

特定の移行にまで移行を実行したい場合は、その移行の名前を指定します。 指定された移行に達するまで、先行するすべての移行が必要に応じて実行されます。

作業ディレクトリを指定する

Migrate.exe MyApp.exe /startupConfigurationFile="MyApp.exe.config" /startupDirectory="c:\\MyApp"

アセンブリに依存関係がある場合や、アセンブリが作業ディレクトリを起点としてファイルを読み取る場合、startupDirectory を設定する必要があります。

使用する移行構成を指定する

Migrate.exe MyAssembly CustomConfig /startupConfigurationFile="..\\web.config"

移行構成のクラス (DbMigrationConfiguration を継承するクラス) が複数ある場合、この実行に使用するクラスを指定する必要があります。 この指定は、上記のように、省略可能な第 2 パラメーターをスイッチなしで指定することで行います。

接続文字列を指定する

Migrate.exe BlogDemo.dll /connectionString="Data Source=localhost;Initial Catalog=BlogDemo;Integrated Security=SSPI" /connectionProviderName="System.Data.SqlClient"

コマンド ラインで接続文字列を指定したい場合は、プロバイダー名も指定する必要があります。 プロバイダー名を指定しないと、例外が発生します。

一般的な問題

エラー メッセージ 解決策
ハンドルされない例外: System.IO.FileLoadException: ファイルまたはアセンブリ 'EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' またはその依存関係の 1 つが読み込めませんでした。 指定したアセンブリのマニフェスト定義がアセンブリ参照と一致しません。 (HRESULT からの例外: 0x80131040) これは一般に、Redirect.config ファイルなしで .NET 4 アプリケーションが実行されていることを意味します。 Redirect.config を migrate.exe と同じ場所にコピーし、その名前を migrate.exe.config に変更する必要があります。
ハンドルされない例外: System.IO.FileLoadException: ファイルまたはアセンブリ 'EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' またはその依存関係の 1 つが読み込めませんでした。 指定したアセンブリのマニフェスト定義がアセンブリ参照と一致しません。 (HRESULT からの例外: 0x80131040) この例外は、Redirect.config を migrate.exe の場所にコピーして .NET 4.5 アプリケーションを実行していることを意味します。 アプリが .NET 4.5 である場合、内部にリダイレクトを含む構成ファイルは必要ありません。 migrate.exe.config ファイルを削除してください。
エラー: 保留中の変更があり、自動移行が無効なため、現在のモデルに対応するようにデータベースを更新できません。 コードベースの移行に対する保留中のモデル変更を作成するか、自動移行を有効にします。 自動移行を有効にするには、DbMigrationsConfiguration.AutomaticMigrationsEnabled を true に設定します。 このエラーは、モデルに加えられた変更に対処する移行が未作成で、データベースがモデルと一致しないときに移行を実行すると発生します。 たとえば、モデルのクラスにプロパティを追加したにもかかわらず、データベースをアップグレードするための移行を作成せずに migrate.exe を実行した場合が該当します。
エラー: メンバー 'System.Data.Entity.Migrations.Design.ToolingFacade+UpdateRunner,EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' の型が解決されていません。 間違ったスタートアップ ディレクトリを指定すると、このエラーが発生することがあります。 これは migrate.exe の場所であることが必要です。
ハンドルされない例外: System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。
   場所: System.Data.Entity.Migrations.Console.Program.Main(String[] args)
ご利用のシナリオで必要なパラメーターが指定されていないことが原因として考えられます。 たとえば、プロバイダー名を指定せずに接続文字列を指定している場合が該当します。
エラー: アセンブリ 'ClassLibrary1' で複数の移行構成型が見つかりました。 使用する型の名前を指定してください。 エラーに記述されているように、指定されたアセンブリには複数の構成クラスが存在します。 /configurationType スイッチを使用して、どれを使用するかを指定する必要があります。
エラー: ファイルまたはアセンブリ ‘<assemblyName>’、またはその依存関係の 1 つが読み込めませんでした。 指定されたアセンブリ名またはコードベースは無効です。 (HRESULT からの例外: 0x80131047) アセンブリ名が間違って指定されたか、指定されていないことが原因として考えられます。
エラー: ファイルまたはアセンブリ ‘<assemblyName>'、またはその依存関係の 1 つが読み込めませんでした。 正しくない形式のプログラムを読み込もうとしました。 これは、x64 アプリケーションに対して migrate.exe を実行しようとした場合に発生します。 EF 5.0 以下が正しく動作するのは x86 のみです。