EF CoreのMigrationsファイルをDbContextを定義したプロジェクトとは別のプロジェクトで管理する構成です。
同じDBを使った複数のアプリ(一般向けWebアプリ、管理者向けWebアプリ、バッチ処理×n、みたいなの)を作成する際に、どのアプリがマイグレーションを管理するのか? に悩まなくなります。
- クラスライブラリ
- .NET Standard 2.0
- NuGet:
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.SqlServer(任意)
- 使用するDBにあわせて適宜変更します。
- DbContextやEntityクラスはここで定義します。
- コンソールアプリケーション
- .NET Core 2.2
- NuGet:
- Microsoft.EntityFrameworkCore.Design
add-migration
、update-database
などの実行に必要です。
- Microsoft.Extensions.CommandLineUtils(任意)
- Migration実行時以外、単体で実行された場合の挙動を制御するために使用しています。
- Microsoft.Extensions.Configuration.Json(任意)
- 接続文字列を管理するために使用しています。
- Microsoft.EntityFrameworkCore.Design
- Migrationファイルはここに作成されていきます。
ASP.NETアプリケーション、コンソールアプリケーションなどを開発する場合は、Sample.Dataを参照追加します。
こうすることで、Webアプリケーション等がMigration関連のパッケージを読み込む必要がなくなります。
DbContext、Entityを普通に作成します。
IDesignTimeDbContextFactory
を継承したクラスを作成します。
- IDesignTimeDbContextFactoryについて
その際、 MigrationsAssembly()
でMigrationファイルの作成先を指定します。
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
namespace Sample.Data.Operator
{
public class DbContextFactory : IDesignTimeDbContextFactory<DbContext>
{
public DbContext CreateDbContext(string[] args)
{
// NOTE: appsettings.jsonから読み込む場合
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false)
.Build();
var connectionString = config.GetConnectionString("Default");
// NOTE: べた書きする場合
//var connectionString = "Server=...";
// NOTE: MigrationsAssemblyでMigrationファイルを作成するアセンブリを指定する
var builder = new DbContextOptionsBuilder<DbContext>()
.UseSqlServer(connectionString, _ => _.MigrationsAssembly(typeof(DbContextFactory).Namespace));
return new DbContext(builder.Options);
}
}
}
Program.cs
は特に必要ありません。
- [既定のプロジェクト]は
Sample.Data.Operator
を選択する Sample.Data.Operator
をスタートアッププロジェクトに設定する
上記の状態で各コマンドを実行します。
PM> add-migration init
To undo this action, use Remove-Migration.
PM> update-database
Applying migration '...`.
Done.
参考) https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet
$ cd .../Sample.Data.Operator
$ dotnet ef migrations add init
Done. To undo this action, use 'ef migrations remove'
$ dotnet ef database update
Applying migration '...'.
Done.