Migraciones con varios proveedores

Las herramientas de EF Core solo aplican scaffolding a las migraciones para el proveedor activo. A veces, sin embargo, es posible que quiera 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 el último.

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 un proyecto de migraciones independientes para obtener instrucciones sobre cómo configurar los proyectos.

Sugerencia

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

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 al usar 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 hosts 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 -- indica a dotnet ef que trate todo lo que sigue como si fuera un argumento y no intente analizarlo como opciones. Los argumentos adicionales no utilizados por dotnet ef se reenvían a la aplicación.