Pembuatan DbContext waktu desain

Beberapa perintah EF Core Tools (misalnya, perintah Migrasi) memerlukan instans turunan DbContext untuk dibuat pada waktu desain untuk mengumpulkan detail tentang jenis entitas aplikasi dan bagaimana mereka memetakan ke skema database. Dalam kebanyakan kasus, diinginkan bahwa DbContext dengan demikian dibuat dikonfigurasi dengan cara yang sama dengan bagaimana hal itu akan dikonfigurasi pada waktu proses.

Ada berbagai cara alat mencoba membuat DbContext:

Dari layanan aplikasi

Jika proyek startup Anda menggunakan ASP.NET Core Web Host atau .NET Core Generic Host, alat mencoba mendapatkan objek DbContext dari penyedia layanan aplikasi.

Alat pertama-tama mencoba mendapatkan penyedia layanan dengan memanggil Program.CreateHostBuilder(), memanggil Build(), lalu mengakses Services properti .

public class Program
{
    public static void Main(string[] args)
        => CreateHostBuilder(args).Build().Run();

    // EF Core uses this method at design time to access the DbContext
    public static IHostBuilder CreateHostBuilder(string[] args)
        => Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(
                webBuilder => webBuilder.UseStartup<Startup>());
}

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
        => services.AddDbContext<ApplicationDbContext>();

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
    }
}

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

Catatan

Saat Anda membuat aplikasi ASP.NET Core baru, hook ini disertakan secara default.

Itu DbContext sendiri dan dependensi apa pun dalam konstruktornya perlu didaftarkan sebagai layanan di penyedia layanan aplikasi. Ini dapat dengan mudah dicapai dengan memiliki konstruktor pada DbContext yang mengambil instans DbContextOptions<TContext> sebagai argumen dan menggunakan AddDbContext<TContext> metode .

Menggunakan konstruktor tanpa parameter

Jika DbContext tidak dapat diperoleh dari penyedia layanan aplikasi, alat mencari jenis turunan DbContext di dalam proyek. Kemudian mereka mencoba membuat instans menggunakan konstruktor tanpa parameter. Ini bisa menjadi konstruktor default jika dikonfigurasi DbContext menggunakan OnConfiguring metode .

Dari pabrik waktu desain

Anda juga dapat memberi tahu alat cara membuat DbContext dengan menerapkan Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<TContext> antarmuka: Jika kelas yang menerapkan antarmuka ini ditemukan dalam proyek yang sama dengan turunan DbContext atau dalam proyek startup aplikasi, alat melewati cara lain untuk membuat DbContext dan menggunakan pabrik waktu desain sebagai gantinya.

public class BloggingContextFactory : IDesignTimeDbContextFactory<BloggingContext>
{
    public BloggingContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
        optionsBuilder.UseSqlite("Data Source=blog.db");

        return new BloggingContext(optionsBuilder.Options);
    }
}

Pabrik waktu desain dapat sangat berguna jika Anda perlu mengonfigurasi DbContext secara berbeda untuk waktu desain daripada pada waktu proses, jika DbContext konstruktor mengambil parameter tambahan tidak terdaftar di DI, jika Anda tidak menggunakan DI sama sekali, atau jika karena alasan tertentu Anda lebih suka tidak memiliki CreateHostBuilder metode di kelas aplikasi Main ASP.NET Core Anda.

Argumen

Baik IDesignTimeDbContextFactory<TContext>.CreateDbContext dan Program.CreateHostBuilder terima argumen baris perintah.

Anda dapat menentukan argumen ini dari alat:

dotnet ef database update -- --environment Production

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.