複数のプロバイダーと移行Migrations with Multiple Providers

EF コア ツールアクティブなプロバイダーへの移行をスキャフォールディングのみです。The EF Core Tools only scaffold migrations for the active provider. 場合によっては、ただし、場合がある、DbContext で (たとえば Microsoft SQL Server や SQLite) の複数のプロバイダーを使用します。Sometimes, however, you may want to use more than one provider (for example Microsoft SQL Server and SQLite) with your DbContext. これに対処する移行で 2 つの方法ができます。There are two ways to handle this with Migrations. 2 つのセットを保持する移行の両方で作業プロバイダー--またはセットを 1 つにマージごとに 1 つのことができます。You can maintain two sets of migrations--one for each provider--or merge them into a single set that can work on both.

2 つの移行セットTwo migration sets

最初の方法では、各モデルの変更の 2 つの移行を生成します。In the first approach, you generate two migrations for each model change.

これは 1 つの方法として各移行のセットを格納する別のアセンブリに 2 つの移行を追加する間、アクティブなプロバイダーと移行アセンブリを手動で切り替えるとします。One way to do this is to put each migration set in a separate assembly and manually switch the active provider (and migrations assembly) between adding the two migrations.

ツールでの作業を容易になりますが、新しい型を作成するもう 1 つの方法は、DbContext から派生して、アクティブなプロバイダーをオーバーライドします。Another approach that makes working with the tools easier is to create a new type derives from your DbContext and overrides the active provider. この型はデザイン時使用の追加または移行を適用するときに時間します。This type is used at design time when adding or applying migrations.

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

注意

各移行セットは、独自の DbContext 型を使用するため、このアプローチは独立した移行アセンブリを使用する必要はありません。Since each migration set uses its own DbContext types, this approach doesn't require using a separate migrations assembly.

新しい移行を追加する場合は、コンテキストの種類を指定します。When adding new migration, specify the context types.

Add-Migration InitialCreate -Context MyDbContext -OutputDir Migrations\SqlServerMigrations
Add-Migration InitialCreate -Context MySqliteDbContext -OutputDir Migrations\SqliteMigrations
dotnet ef migrations add InitialCreate --context MyDbContext --output-dir Migrations/SqlServerMigrations
dotnet ef migrations add InitialCreate --context MySqliteDbContext --output-dir Migrations/SqliteMigrations

ヒント

最後の 1 つの兄弟として作成されているので、次の移行の出力ディレクトリを指定する必要はありません。You don't need to specify the output directory for subsequent migrations since they are created as siblings to the last one.

1 つの移行のセットOne migration set

移行の 2 つのセットを持つしない場合に、手動で一緒に両方のプロバイダーに適用できる 1 つのセットにします。If you don't like having two sets of migrations, you can manually combine them into a single set that can be applied to both providers.

注釈は、プロバイダーが理解していないすべての注釈を無視するために共存できます。Annotations can coexist since a provider ignores any annotations that it doesn't understand. たとえば、Microsoft SQL Server と SQLite の両方で動作する主キー列は、次のようになります。For example, a primary key column that works with both Microsoft SQL Server and SQLite might look like this.

Id = table.Column<int>(nullable: false)
    .Annotation("SqlServer:ValueGenerationStrategy",
        SqlServerValueGenerationStrategy.IdentityColumn)
    .Annotation("Sqlite:Autoincrement", true),

操作は、1 つのプロバイダーにのみ適用できます (またはプロバイダー間で異なる方法である) を使用して、ActiveProviderプロパティをプロバイダーがアクティブに指示します。If operations can only be applied on one provider (or they're differently between providers), use the ActiveProvider property to tell which provider is active.

if (migrationBuilder.ActiveProvider == "Microsoft.EntityFrameworkCore.SqlServer")
{
    migrationBuilder.CreateSequence(
        name: "EntityFrameworkHiLoSequence");
}