Aracılığıyla paylaş


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 DbContextiç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.