今日もちょいつか

お酒の飲み過ぎか、それとも歳のせいなのか毎日ちょっぴり疲れ気味なフリーのソフト屋です。ソフト開発の話題をblogにしてみます。

ASP.NET Core MVC MacでMySQLのMigrationが結構ハマりました

Visual Studio Community 2017 for Macを使ってASP.NETの開発をしているのですが
データベース(MySQL)のMigrationを動かすことができずにかなり悩んでしまいました。
最初はなんでもはまってしまうものです。

調べてみると、
Migrationの操作方法は
Package Manager Consoleで操作する方法と
dotnet ef コマンドによる操作があるようです。

このどちらもうまくゆきません。
まず、Package Manager Console ですが
Visual Studio Community 2017 for Macのどこを探しても
発見できないのです。

また、dotnet ef コマンドをTerminalから打ち込んでみるも
「コマンド "dotnet-ef" に一致する実行可能ファイルが見つかりません」
となってしまいます。

とりあえず、Package Manager Consoleの方から
じっくり調べてみました。
すると、なんと!for MacにはPackage Manager Consoleが存在しないようです。
マイクロソフトの公式サイト(英語)にありました。
docs.microsoft.com
日本語に訳して画像にしてみました。
f:id:Heinlein:20180118114234p:plain
MacでのPackage Manager Consoleの利用は無理のようです。

では、dotnet ef コマンドをTerminalから操作するしかありません。
いろいろと調べてみると
dotnet ef コマンドは、

Microsoft.EntityFrameworkCore.Tools.DotNet

で提供されているようです。
どうやらMicrosoft.EntityFrameworkCore.Tools.DotNetをインストールしないといけないようです。
NuGetではインストールできなくて(実際エラーになります)
直接プロジェクトファイルを編集しないといけないようです。
.csprojをエディタで開いて以下を追記します。

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.1" />
  </ItemGroup>

追加したら、Terminalから

dotnet restore 

の実行で、dotnet ef コマンドが使えるようになりました。

マイグレーションファイルの作成は

dotnet ef migrations add マイグレーション名

マイグレーション実行は

dotnet ef database update

となります。

マイグレーションを実行するとちゃんとMySQLへテーブルが作成されました。
そしてMySQLの中に「__EFMigrationsHistory」テーブルも作成されます。
このテーブルにマイグレーションを実行した履歴が残りますので
次回にマイグレーションを実行する際はこの履歴テーブルに無い
マイグレーションファイルが実行されるわけです。

この仕組を使うと、
ローカルの開発環境からサーバーのデータベース環境への適用ががとても簡単になりますので
積極的に使ってゆきたいと思います。