Tasarım Zamanında DbContext Oluşturma
EF Core Tools komutlarından bazıları (örneğin, Geçişler komutları), uygulamanın varlık türleri ve bunların bir veritabanı şemasıyla nasıl eşlendiği hakkında ayrıntılı bilgi toplamak için tasarım zamanında türetilmiş DbContext
bir örneğin oluşturulmasını gerektirir. Çoğu durumda, oluşturulan öğesinin DbContext
çalışma zamanında nasıl yapılandırılacağına benzer bir şekilde yapılandırılması istenir.
Araçların oluşturmak DbContext
için deneyecekleri çeşitli yollar vardır:
Uygulama hizmetlerinden
Başlangıç projeniz ASP.NET Core Web Konağı veya .NET Core Genel Ana Bilgisayarı kullanıyorsa, araçlar uygulamanın hizmet sağlayıcısından DbContext nesnesini almaya çalışır.
Araçlar önce çağrısı yaparak, ardından özelliğine erişerek Program.CreateHostBuilder()
Build()
hizmet sağlayıcısını Services
almaya çalışır.
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)
{
}
}
Dekont
Yeni bir ASP.NET Core uygulaması oluşturduğunuzda, bu kanca varsayılan olarak eklenir.
Kendisi DbContext
ve oluşturucusunda yer alan bağımlılıkların uygulamanın hizmet sağlayıcısında hizmet olarak kaydedilmesi gerekir. Bu, örneğini bağımsız değişken olarak alan ve yöntemini kullananAddDbContext<TContext>
bir DbContextOptions<TContext>
oluşturucuya DbContext
sahip olarak kolayca elde edilebilir.
Parametresiz bir oluşturucu kullanma
DbContext uygulama hizmeti sağlayıcısından alınamıyorsa, araçlar projenin içindeki türetilmiş DbContext
türü arar. Ardından parametresiz bir oluşturucu kullanarak örnek oluşturmaya çalışırlar. yöntemi kullanılarak OnConfiguring
yapılandırılmışsaDbContext
, bu varsayılan oluşturucu olabilir.
Tasarım zamanı fabrikasından
Ayrıca arabirimini uygulayarak Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<TContext> DbContext'inizi nasıl oluşturabileceğinizi araçlara da anlatabilirsiniz: Bu arabirimi uygulayan bir sınıf türetilenle DbContext
aynı projede veya uygulamanın başlangıç projesinde bulunursa, araçlar DbContext oluşturmanın diğer yollarını atlar ve bunun yerine tasarım zamanı fabrikasını kullanır.
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);
}
}
Tasarım zamanı fabrikası, tasarım zamanı için çalışma zamanından DbContext
farklı yapılandırmanız gerekiyorsa, oluşturucu ek parametreler alıyorsa DbContext
DI'ye kayıtlı değilse, DI kullanmıyorsanız veya bir nedenden dolayı ASP.NET Core uygulamanızın Main
sınıfında bir CreateHostBuilder
yöntemin olmasını tercih ediyorsanız özellikle yararlı olabilir.
Bağımsız Değişkenler
Program.CreateHostBuilder
Hem hem de IDesignTimeDbContextFactory<TContext>.CreateDbContext komut satırı bağımsız değişkenlerini kabul edin.
Araçlardan şu bağımsız değişkenleri belirtebilirsiniz:
dotnet ef database update -- --environment Production
Belirteç, --
izleyen her şeyi bağımsız değişken olarak ele almaya yönlendirir dotnet ef
ve bunları seçenek olarak ayrıştırmaya çalışmaz. tarafından dotnet ef
kullanılmayan ek bağımsız değişkenler uygulamaya iletilir.