Dela via


Migreringar med flera providers

EF Core Tools samlar endast in migreringar för den aktiva providern. Ibland kanske du dock vill använda mer än en provider (till exempel Microsoft SQL Server och SQLite) med din DbContext. Hantera detta genom att underhålla flera uppsättningar migreringar – en för varje provider – och lägga till en migrering till var och en för varje modelländring.

Använda flera kontexttyper

Ett sätt att skapa flera migreringsuppsättningar är att använda en DbContext-typ per provider.

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

Ange kontexttypen när du lägger till nya migreringar.

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

Tips/Råd

Du behöver inte ange utdatakatalogen för efterföljande migreringar eftersom de skapas som syskon till den sista.

Använda en kontexttyp

Du kan också använda en DbContext-typ. Detta kräver för närvarande att migreringarna flyttas till en separat samling. Anvisningar om hur du konfigurerar dina projekt finns i Använda ett separat migreringsprojekt .

Tips/Råd

Du kan visa den här artikelns exempel på GitHub.

Du kan skicka argument till appen från verktygen. Detta kan möjliggöra ett mer effektivt arbetsflöde som undviker att behöva göra manuella ändringar i projektet när verktygen körs.

Här är ett mönster som fungerar bra när du använder en allmän värd.

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

Eftersom den förvalda värdbyggaren läser konfigurationen från kommandoradsargument, kan du ange leverantören när du kör verktygen.

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

Tips/Råd

Det ---token dirigerar dotnet ef att behandla allt som följer som ett argument och inte försöka parsa dem som alternativ. Eventuella extra argument som inte används av dotnet ef vidarebefordras till appen.