Compartilhar via


Migrações com vários provedores

As Ferramentas do EF Core apenas estruturam migrações para o provedor ativo. Mas às vezes, talvez você queira usar mais de um provedor (por exemplo, Microsoft SQL Server e SQLite) com seu DbContext. Resolva isso mantendo vários conjuntos de migrações, um para cada provedor, e adicionando uma migração a cada alteração de modelo.

Como usar vários tipos de contexto

Uma maneira de criar vários conjuntos de migração é usar um tipo DbContext por provedor.

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

Especifique o tipo de contexto ao adicionar novas migrações.

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

Dica

Você não precisa especificar o diretório de saída para migrações subsequentes, pois elas são criadas como irmãos para a última.

Como usar um tipo de contexto

Também é possível usar um tipo DbContext. Atualmente, isso requer mover as migrações para um assembly separado. Consulte Como usar um Projeto de Migrações Separado para obter instruções sobre como configurar seus projetos.

Dica

Veja o exemplo deste artigo no GitHub.

Você pode passar argumentos para o aplicativo a partir das ferramentas. Isso pode habilitar um fluxo de trabalho mais simplificado que evita a necessidade de fazer alterações manuais no projeto ao executar as ferramentas.

Aqui está um padrão que funciona bem ao usar um Host Genérico.

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}")
                    });
            });

Como o construtor de host padrão lê a configuração de argumentos de linha de comando, você pode especificar o provedor ao executar as ferramentas.

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

Dica

O token -- direciona dotnet ef para tratar tudo o que se segue como um argumento e não tentar analisá-los como opções. Todos os argumentos extras não usados por dotnet ef são encaminhados para o aplicativo.