Migrasi dengan Beberapa Penyedia

Migrasi perancah hanya Alat Inti EF untuk penyedia aktif. Namun, terkadang Anda mungkin ingin menggunakan lebih dari satu penyedia (misalnya Microsoft SQL Server dan SQLite) dengan DbContext Anda. Tangani ini dengan mempertahankan beberapa set migrasi--satu untuk setiap penyedia--dan menambahkan migrasi ke masing-masing untuk setiap perubahan model.

Menggunakan beberapa jenis konteks

Salah satu cara untuk membuat beberapa set migrasi adalah dengan menggunakan satu jenis DbContext per penyedia.

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

Tentukan jenis konteks saat menambahkan migrasi baru.

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

Tip

Anda tidak perlu menentukan direktori output untuk migrasi berikutnya karena dibuat sebagai saudara kandung untuk yang terakhir.

Menggunakan satu jenis konteks

Anda juga dapat menggunakan satu jenis DbContext. Saat ini memerlukan pemindahan migrasi ke rakitan terpisah. Silakan merujuk ke Menggunakan Proyek Migrasi Terpisah untuk instruksi tentang menyiapkan proyek Anda.

Tip

Anda dapat melihat contoh artikel ini di GitHub.

Anda dapat meneruskan argumen ke dalam aplikasi dari alat. Ini dapat mengaktifkan alur kerja yang lebih efisien yang menghindari harus membuat perubahan manual pada proyek saat menjalankan alat.

Berikut adalah salah satu pola yang berfungsi dengan baik saat menggunakan Host Generik.

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

Karena penyusun host default membaca konfigurasi dari argumen baris perintah, Anda dapat menentukan penyedia saat menjalankan alat.

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

Tip

Token -- mengarahkan dotnet ef untuk memperlakukan semua yang mengikuti sebagai argumen dan tidak mencoba mengurainya sebagai opsi. Argumen tambahan apa pun yang tidak digunakan oleh dotnet ef diteruskan ke aplikasi.