新しもの好きプログラマの耳より情報ブログ

仕事でもあるプログラミングについて役に立ちそうな情報を発信していこうというブログです。役に立たなそうな情報はfacebookで。

Entity Framework Coreで、同じプロジェクトに複数のDBContextを入れる場合のマイグレーションの使い分け方

概要

Entity Framework CoreのCode Firstでは、DBContextを継承した型でDBのテーブルを定義すると、コマンドでDBのマイグレーションをしたりそのためのSQL文を出力できます。しかし、1つのプロジェクトで複数のDBを扱いたい場合は、複数のDBContext派生型を作って同じコマンドを打っても、マイグレーションが上手く行きません。その場合のマイグレーションのやり方です。

解決方法

次のように、通常のマイグレーションのコマンドに、2つのオプションを追加します。

dotnet ef migrations add <このマイグレーションの名前> --context <DBContext派生型のクラス名> --output-dir <このマイグレーションの出力先フォルダパス>

contextオプションに、どのDBContext派生型のマイグレーションを追加するかを指定します。ここはクラス名をそのまま指定します。

そのままだと別々のDBContext派生型のマイグレーション出力が混ざって分かりづらくなるため、output-dirオプションに、出力先のフォルダを指定します。DBContext派生型ごとにフォルダを分けると良いと思います。

値を入れた例としてはこんな感じです。

//前提
class UserDBContext : DBContext { ... }
class RoleDBContext : DBContext { ... }
dotnet ef migrations add Ver_2_0 --context UserDBContext --output-dir Migrations/UserDB
dotnet ef migrations add Ver_2_0 --context RoleDBContext --output-dir Migrations/RoleDB

この後のupdateコマンドなども同様に、contextオプションを指定します。

dotnet ef database update --context <DBContext派生型のクラス名>

値を入れた例だとこうなります。

dotnet ef database update --context UserDBContext
dotnet ef database update --context RoleDBContext

EF Coreはサンプル通りに動かすだけならサンプルのコマンドをコピペするだけでも動きますが、ちゃんと使っていくと理解するべきところが増えてきます。1つずつ調べていきましょう。