Skip to content

ushibutatory/efcore-separate-migrations

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 

Repository files navigation

efcore-separate-migrations

概要

EF CoreのMigrationsファイルをDbContextを定義したプロジェクトとは別のプロジェクトで管理する構成です。

何が嬉しいのか

同じDBを使った複数のアプリ(一般向けWebアプリ、管理者向けWebアプリ、バッチ処理×n、みたいなの)を作成する際に、どのアプリがマイグレーションを管理するのか? に悩まなくなります。

構成

image

Sample.Data

  • クラスライブラリ
  • .NET Standard 2.0
  • NuGet:
    • Microsoft.EntityFrameworkCore
    • Microsoft.EntityFrameworkCore.SqlServer(任意)
      • 使用するDBにあわせて適宜変更します。
  • DbContextやEntityクラスはここで定義します。

Sample.Data.Operator

  • コンソールアプリケーション
  • .NET Core 2.2
  • NuGet:
    • Microsoft.EntityFrameworkCore.Design
      • add-migrationupdate-databaseなどの実行に必要です。
    • Microsoft.Extensions.CommandLineUtils(任意)
      • Migration実行時以外、単体で実行された場合の挙動を制御するために使用しています。
    • Microsoft.Extensions.Configuration.Json(任意)
      • 接続文字列を管理するために使用しています。
  • Migrationファイルはここに作成されていきます。

ASP.NETアプリケーション、コンソールアプリケーションなどを開発する場合は、Sample.Dataを参照追加します。

こうすることで、Webアプリケーション等がMigration関連のパッケージを読み込む必要がなくなります。

解説

Sample.Data

DbContext、Entityを普通に作成します。

Sample.Data.Operator

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 は特に必要ありません。

マイグレーションの作成・実行

Visual Studio パッケージマネージャコンソール上で実行する場合

  • [既定のプロジェクト]は Sample.Data.Operator を選択する
  • Sample.Data.Operator をスタートアッププロジェクトに設定する

上記の状態で各コマンドを実行します。

PM> add-migration init
To undo this action, use Remove-Migration.

PM> update-database
Applying migration '...`.
Done.

CLIで実行する場合

参考) 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.

About

[C#]EF CoreのDbContextとMigrationsとをそれぞれ別プロジェクトで管理する

Topics

Resources

Stars

Watchers

Forks

Languages