Entity Frameworkコア移行を自身のアセンブリに加える方法


私たちがしたいことは、簡単にメンテナンスのための独自のプロジェクト/アセンブリ内の移行を格納し、マイグレーション特定のコードを生産バイナリから維持することです.また、私たちのスタートアッププロジェクトが移行特定のライブラリに依存することを望まない.
この例では、私たちはすでにプロジェクトを
それはこのように見えるかもしれない

MyApp.Web.Api <-- ASP.Net Project
MyApp.Application <-- Class Library
MyApp.Domain <-- Class Library
MyApp.Infrastructure <-- Class Library (contains DBContext)



新しい移行クラスライブラリを作成する
我々は移動を保持するための新しいクラスライブラリを作成することから始めます
呼ばれるMyApp.Infrastructure.Migrations
dotnet new classlib -n MyApp.Persistence.Migrations
我々はマイクロソフトにリファレンスを追加します.EntityFrameworkcoreとマイクロソフト.EntityFrameworkCore.デザイン.ツールキットがマイグレーションスクリプトを検出して生成できるようにするために
MyAppから.インフラ.移行フォルダ
dotnet add package Microsoft.EntityFrameworkCore --version 5.0.1
dotnet add package Microsoft.EntityFrameworkCore.Design --version 5.0.1

dbcontextを含むプロジェクトへの参照を追加する
Entity Frameworkの移行ツールでは、異なるプロジェクトにあるDBContextを見つける必要がありますので、MyAppを参照する必要があります.インフラプロジェクト
MyAppから.インフラ.移行フォルダ
dotnet add reference ../MyApp.Infrastructure/MyApp.Infrastructure.csproj

実装の実装
Startupプロジェクトを使用する必要がないようにするには、IsDesignTimeBitContextFactoryを実装し、移行ツールが適切なDBContextファイルを見つけることができます.そこで、ApplicationDBContextFactoryという新しいファイルを生成します.コード付きCS
アプリケーション.cs
using System;
using System.IO;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using MyApp.Infrastructure;

namespace MyApp.Infrastructure.Migrations
{
    public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
    {
        public ApplicationDbContext CreateDbContext(string[] args)
        {
            var configuration = new ConfigurationBuilder()
                 .SetBasePath(Directory.GetCurrentDirectory())
                 .AddJsonFile("appsettings.json", true)
                 .AddEnvironmentVariables()
                 .Build();

            var builder = new DbContextOptionsBuilder();

            var connectionString = configuration
                        .GetConnectionString("DefaultConnection");

            builder.UseSqlServer(connectionString,
                        x => x.MigrationsAssembly(typeof(ApplicationDbContextFactory).Assembly.FullName));



            return new ApplicationDbContext(builder.Options);
        }
    }
}
私たちは、ツールを我々の移動ライブラリから直接DBContextに初期化して、接続文字列を提供する必要があります.
AppSettingsを作成することで行います.我々の移行クラスライブラリの中のJSONファイル
appsettingsJSON
{ 

    "ConnectionStrings": {
        "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=myapp;Trusted_Connection=True;MultipleActiveResultSets=true"
    }
}

移行を加える
マイグレーションを実行し、新しいプロジェクトの中にマイグレーションフォルダの構造を作成します
MyAppから.インフラ.移行フォルダ
dotnet ef migrations add InitialCreate