Compartilhar via


Migrações com vários provedores

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

Usando 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.

Usando um tipo de contexto

Também é possível utilizar um tipo de DbContext. Atualmente, é necessário mover as migrações para um assembly separado. Consulte o Uso de um Projeto de Migrações Separado para obter instruções sobre como configurar seus projetos.

Dica

Você pode visualizar o exemplo de 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.