Migraciones con varios proveedores

Las EF Core Tools solo scaffolding para el proveedor activo. Sin embargo, a veces es posible que desee usar más de un proveedor (por ejemplo, Microsoft SQL Server y SQLite) con DbContext. Para controlar esto, mantenga varios conjuntos de migraciones (uno para cada proveedor) y agregue una migración a cada uno para cada cambio de modelo.

Uso de varios tipos de contexto

Una manera de crear varios conjuntos de migración es usar un tipo DbContext por proveedor.

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

Especifique el tipo de contexto al agregar nuevas migraciones.

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

Sugerencia

No es necesario especificar el directorio de salida para las migraciones posteriores, ya que se crean como elementos relacionados con la última.

Uso de un tipo de contexto

También es posible usar un tipo DbContext. Actualmente, esto requiere mover las migraciones a un ensamblado independiente. Consulte Uso de una aplicación de migración Project para obtener instrucciones sobre cómo configurar los proyectos.

Sugerencia

Puede ver en GitHub un ejemplo de este artículo.

A partir EF Core 5.0, puede pasar argumentos a la aplicación desde las herramientas. Esto puede permitir un flujo de trabajo más simplificado que evite tener que realizar cambios manuales en el proyecto al ejecutar las herramientas.

Este es un patrón que funciona bien cuando se usa un 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}")
                    });
            });

Dado que el generador de host predeterminado lee la configuración de los argumentos de la línea de comandos, puede especificar el proveedor al ejecutar las herramientas.

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

Sugerencia

El token dirige a tratar todo lo que sigue como argumento y no intentar --dotnet ef analizarlos como opciones. Los argumentos adicionales que no usa dotnet ef se reenvía a la aplicación.

Nota

La capacidad de especificar argumentos adicionales para la aplicación se agregó EF Core 5.0. Si usa una versión anterior, especifique los valores de configuración con variables de entorno en su lugar.