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.