여러 공급자를 사용하여 마이그레이션

EF Core 도구는 활성 공급자에 대한 마이그레이션만 스캐폴드합니다. 그러나 DbContext와 함께 둘 이상의 공급자(예: Microsoft SQL Server 및 SQLite)를 사용할 수도 있습니다. 각 공급자에 대해 하나씩 여러 마이그레이션 집합을 유지 관리하고 모든 모델 변경에 대해 각각에 마이그레이션을 추가하여 이 작업을 처리합니다.

여러 컨텍스트 형식 사용

여러 마이그레이션 집합을 만드는 한 가지 방법은 공급자당 하나의 DbContext 형식을 사용하는 것입니다.

class SqliteBlogContext : BlogContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlite("Data Source=my.db");
}

새 마이그레이션을 추가할 때 컨텍스트 유형을 지정합니다.

dotnet ef migrations add InitialCreate --context BlogContext --output-dir Migrations/SqlServerMigrations
dotnet ef migrations add InitialCreate --context SqliteBlogContext --output-dir Migrations/SqliteMigrations

후속 마이그레이션에 대한 출력 디렉터리가 마지막 마이그레이션에 대한 형제로 생성되므로 지정할 필요가 없습니다.

하나의 컨텍스트 형식 사용

하나의 DbContext 형식을 사용할 수도 있습니다. 이렇게 하려면 현재 마이그레이션을 별도의 어셈블리로 이동해야 합니다. 프로젝트 설정에 대한 지침은 별도의 마이그레이션 프로젝트 사용을 참조하세요.

GitHub에서 이 문서의 샘플을 볼 수 있습니다.

도구에서 앱에 인수를 전달할 수 있습니다. 이렇게 하면 도구를 실행할 때 프로젝트를 수동으로 변경할 필요가 없는 보다 간소화된 워크플로를 사용할 수 있습니다.

다음은 제네릭 호스트를 사용할 때 잘 작동하는 한 가지 패턴입니다.

public static IHostBuilder CreateHostBuilder(string[] args)
    => Host.CreateDefaultBuilder(args)
        .ConfigureServices(
            (hostContext, services) =>
            {
                services.AddHostedService<Worker>();

                // Set the active provider via configuration
                var configuration = hostContext.Configuration;
                var provider = configuration.GetValue("Provider", "SqlServer");

                services.AddDbContext<BlogContext>(
                    options => _ = provider switch
                    {
                        "Sqlite" => options.UseSqlite(
                            configuration.GetConnectionString("SqliteConnection"),
                            x => x.MigrationsAssembly("SqliteMigrations")),

                        "SqlServer" => options.UseSqlServer(
                            configuration.GetConnectionString("SqlServerConnection"),
                            x => x.MigrationsAssembly("SqlServerMigrations")),

                        _ => throw new Exception($"Unsupported provider: {provider}")
                    });
            });

기본 호스트 빌더는 명령줄 인수에서 구성을 읽기 때문에 도구를 실행할 때 공급자를 지정할 수 있습니다.

dotnet ef migrations add MyMigration --project ../SqlServerMigrations -- --provider SqlServer
dotnet ef migrations add MyMigration --project ../SqliteMigrations -- --provider Sqlite

-- 토큰은 뒤에 나타나는 모든 항목을 인수로 처리하고 이를 옵션으로 구문 분석하지 않도록 dotnet ef에 지시합니다. dotnet ef에서 사용하지 않는 추가 인수는 앱으로 전달됩니다.