Migrações com vários provedoresMigrations with Multiple Providers

O [ferramentas do EF Core] 1 apenas criar o scaffolding de migrações para o provedor de Active Directory.The EF Core Tools only scaffold migrations for the active provider. Às vezes, no entanto, você talvez queira usar mais de um provedor (por exemplo, Microsoft SQL Server e SQLite) com seu DbContext.Sometimes, however, you may want to use more than one provider (for example Microsoft SQL Server and SQLite) with your DbContext. Há duas maneiras de lidar com isso com as migrações.There are two ways to handle this with Migrations. Você pode manter dois conjuntos de migrações – uma para cada provedor – ou mesclagem-los em um único conjunto de que possa trabalhar em ambos.You can maintain two sets of migrations--one for each provider--or merge them into a single set that can work on both.

Dois conjuntos de migraçãoTwo migration sets

A primeira abordagem, você gera duas migrações de cada alteração de modelo.In the first approach, you generate two migrations for each model change.

Uma forma de fazer isso é colocar cada conjunto de migração [em um assembly separado] 2 e mudar manualmente o provedor de Active Directory (e o conjunto de migrações) entre as duas migrações de adicionar.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.

É outra abordagem que facilita o trabalho com as ferramentas criar um novo tipo que deriva de seu DbContext e substitui o provedor de Active Directory.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. Esse tipo é usado no design de tempo durante a adição ou a aplicação de migrações.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");
}

Observação

Como cada conjunto de migração usa seus próprios tipos de DbContext, essa abordagem não exige o uso de um assembly de migrações separadas.Since each migration set uses its own DbContext types, this approach doesn't require using a separate migrations assembly.

Ao adicionar nova migração, especifica os tipos de contexto.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

Dica

Você não precisa especificar o diretório de saída para migrações subsequentes, pois eles são criados como irmãos para o último deles.You don't need to specify the output directory for subsequent migrations since they are created as siblings to the last one.

Conjunto de uma migraçãoOne migration set

Se você não gostar de ter dois conjuntos de migrações, você pode combiná-los manualmente em um único conjunto pode ser aplicado a ambos os provedores.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.

As anotações podem coexistir, pois um provedor ignora todas as anotações que não entende.Annotations can coexist since a provider ignores any annotations that it doesn't understand. Por exemplo, uma coluna de chave primária que funciona com o Microsoft SQL Server e SQLite pode parecer com isso.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),

Se operações somente podem ser aplicadas em um provedor (ou eles são diferente entre provedores), use o ActiveProvider propriedade informar qual provedor está ativo.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");
}