複数のプロバイダーを使用した移行Migrations with Multiple Providers

EF Core ツールのみ active プロバイダーへの移行をスキャフォールディングします。The EF Core Tools only scaffold migrations for the active provider. 場合によっては、ただし、可能性がある、DbContext で 1 つ以上のプロバイダー (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.

別の方法をツールで作業が容易では、DbContext から派生し、アクティブなプロバイダーをオーバーライドする新しい型を作成します。Another approach that makes working with the tools easier is to create a new type that 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 つのセットがない場合は、手動で両方のプロバイダーに適用できる単一セットに結合することができます。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");
}