MSBuildでMigrationを実行する

こんにちは。beaglesoftの真鍋です。

ここ数日ほどAzureでビルドができるように試行錯誤しています。ビルドのプロセス構築はRailsのほうが情報量が多くわかりやすいですね。

さて、そんなビルドプロセスの作成ですが避けては通れないのがMigrationの管理です。EntityFramewok(EF)には自動マイグレーションがあるのでアプリケーションへの初回接続時にMigrationga自動的に走ってくれるのですが、やはり明示的にMigrationを実行したいとおもいます。

いろいろと調べていると、EFをnugetでダウンロードしたディレクトリにはMigration.exeが用意されていてこれを利用すれば良いらしいと言うことがわかりました。

ef_1.png (52.0 kB)

ただ、このMigration.exeですが単体では動作しないようで'EntityFramework.dll'と同一のディレクトリで動作する必要があります。まぁ当たり前ですよね。で、今回はそんな面倒なことをしたいと思っていなかったのでMSBuildでビルド時にMigrationを実行してしまいたいと思います。

参考にしたのは です。StackOverflowですね。

設定内容はプロジェクトファイルに以下の記述を追加します。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
  <Target Name="AfterBuild">
    <copy SourceFiles="$(SolutionDir)packages\EntityFramework.6.1.3\tools\migrate.exe" DestinationFolder="$(TargetDir)" />
    <exec Command="$(TargetDir)migrate.exe  {プロジェクト.dll}  Configuration /startUpDirectory:$(TargetDir) /startUpConfigurationFile:$(TargetDir){プロジェクト.dll} .config /verbose"/>
  </Target>
  
</Project>

{プロジェクト.dll}にはMigration対象のdllを設定します。

あとはビルドを実行すれば以下の通りビルド結果が表示されて、Migrationが実行されると思います。

1>------ ビルド開始: プロジェクト:BeagleBase, 構成:Debug Any CPU ------
1>2016/03/21 16:59:30 にビルドを開始しました。
1>ツール バージョン "14.0" でビルドしています。
1>ファイル "C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets" 内にある、プロジェクト "C:\Users\ymanabe\Source\Repos\BeagleBase\BeagleBase\BeagleBase.csproj" からのターゲット "_CheckForInvalidConfigurationAndPlatform" (エントリ ポイント):
...
1>プロジェクト "C:\Users\ymanabe\Source\Repos\BeagleBase\BeagleBase\BeagleBase.csproj" 内のターゲット"AfterBuild" (ターゲット "Build" は依存):
1>タスク "copy"
1>  "C:\Users\ymanabe\Source\Repos\BeagleBase\packages\EntityFramework.6.1.3\tools\migrate.exe" から "C:\Users\ymanabe\Source\Repos\BeagleBase\BeagleBase\bin\migrate.exe" へファイルをコピーしています。
1>タスク "copy" の実行が終了しました。
1>"exec" タスクをアセンブリ "Microsoft.Build.Tasks.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" から使用しています。
1>タスク "exec"
1>  C:\Users\ymanabe\Source\Repos\BeagleBase\BeagleBase\bin\migrate.exe BeagleBase.dll Configuration /startUpDirectory:C:\Users\ymanabe\Source\Repos\BeagleBase\BeagleBase\bin\ /startUpConfigurationFile:C:\Users\ymanabe\Source\Repos\BeagleBase\BeagleBase\bin\BeagleBase.dll.config /verbose
1>  詳細: ターゲット データベースは 'beaglebase_dev' (データ ソース: tcp:girafa.database.windows.net,1433、プロバイダー: System.Data.SqlClient、原点: Configuration) です。
1>  明示的な移行を適用しています: [201603020813427_InitialCreate, 201603020845547_CreateUserDetail, 201603060137225_RemoveUserDisplay2UserDetail]。
1>  明示的な移行を適用しています: 201603020813427_InitialCreate。
...
1>  Seed メソッドを実行しています。
1>タスク "exec" の実行が終了しました。
1>プロジェクト "BeagleBase.csproj" 内のターゲット "AfterBuild" のビルドが終了しました。
1>false 条件により、ターゲット "MvcBuildViews" を省略しました。('$(MvcBuildViews)'=='true') は ('false'=='true') として評価されました。
1>false 条件により、ターゲット "CleanupForBuildMvcViews" を省略しました。( '$(_EnableCleanOnBuildForMvcViews)'=='true' and '$(MVCBuildViews)'=='true' ) は ( 'true'=='true' and 'false'=='true' ) として評価されました。
1>ファイル "C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets" 内にある、プロジェクト "C:\Users\ymanabe\Source\Repos\BeagleBase\BeagleBase\BeagleBase.csproj" からのターゲット "Build" (エントリ ポイント):
1>プロジェクト "BeagleBase.csproj" 内のターゲット "Build" のビルドが終了しました。
1>
1>ビルドに成功しました。
1>
1>経過時間 00:00:08.82
========== ビルド: 1 正常終了、0 失敗、2 更新不要、0 スキップ ==========

もう少しMigrationを簡単にできるとありがたいのですが、その辺は今後改善されるのでしょうかね。いずれにしても、皆さんのお役に立てればと思います。Enjoy!