Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 agar DbContext yang dibuat dengan demikian dikonfigurasi dengan cara yang sama seperti bagaimana hal itu akan dikonfigurasi pada waktu berjalan.
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.
Perangkat pertama-tama berusaha mendapatkan penyedia layanan dengan melakukan pemanggilan Program.CreateHostBuilder(), kemudian Build(), dan setelah itu mengakses properti Services.
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)
{
}
}
Note
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 DbContext dikonfigurasi menggunakan metode OnConfiguring.
Dari pabrik dalam tahap desain
Anda juga dapat memberi tahu alat cara membuat DbContext dengan menerapkan antarmuka Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<TContext>: Jika kelas yang menerapkan antarmuka ini ditemukan dalam proyek yang sama dengan turunan DbContext atau dalam proyek startup aplikasi, alat akan mengabaikan metode pembuatan DbContext lainnya dan akan menggunakan pabrik di 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);
}
}
Fabrikasi saat desain dapat sangat berguna jika Anda perlu mengonfigurasi DbContext secara berbeda untuk saat desain daripada pada saat run time, jika parameter tambahan yang diambil oleh konstruktor DbContext tidak terdaftar di DI, jika Anda tidak menggunakan DI sama sekali, atau jika Anda, karena alasan tertentu, lebih suka tidak memiliki metode CreateHostBuilder di kelas Main aplikasi ASP.NET Core Anda.
Args
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.