Tasarım Zamanında DbContext Oluşturma

EF Core araçları komutlarından bazıları (örneğin, geçişler komutları) DbContext , uygulamanın varlık türleri ve bir veritabanı şemasına nasıl eşlendikleri hakkında bilgi toplamak için tasarım zamanında bir türetilmiş örnek oluşturulmasını gerektirir. Çoğu durumda, bu DbContext nedenle oluşturulması, çalışma zamanında nasıl yapılandırılacağındanbenzer bir şekilde yapılandırılmalıdır.

Araçların şunları oluşturmayı denemenin çeşitli yolları vardır DbContext :

Uygulama hizmetlerinden

Başlangıç projeniz ASP.NET Core Web konağını veya .NET Core genel konağınıkullanıyorsa, Araçlar DbContext nesnesini uygulamanın hizmet sağlayıcısından almaya çalışır.

Araçlar, Program.CreateHostBuilder() sonra özelliğe erişen, çağırarak ve ardından hizmet sağlayıcısını almaya çalışır Build() 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)
    {
    }
}

Not

Yeni bir ASP.NET Core uygulaması oluşturduğunuzda, bu kanca varsayılan olarak dahil edilir.

DbContextKendisinin ve oluşturucusunun içindeki bağımlılıkların, uygulamanın hizmet sağlayıcısında hizmet olarak kaydedilmesi gerekir. Bu , DbContext DbContextOptions<TContext> bir bağımsız değişken olarak bir örneği alan ve metodunu kullanarak, üzerinde bir Oluşturucu bulundurarak kolayca elde edilebilir. AddDbContext<TContext>

Parametresiz bir Oluşturucu kullanma

DbContext uygulama hizmeti sağlayıcısından alınamıyorsa, Araçlar DbContext proje içindeki türetilmiş türü arar. Daha sonra parametresiz bir Oluşturucu kullanarak bir örnek oluşturmaya çalışır. Yöntemi kullanılarak yapılandırıldıysa, varsayılan Oluşturucu bu olabilir DbContext OnConfiguring .

Tasarım zamanı fabrikasından

Ayrıca, arabirimi kullanarak DbContext 'in nasıl oluşturulacağını de söyleyebilirsiniz Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<TContext> : Bu arabirimi uygulayan bir sınıf, türetilen DbContext veya uygulamanın başlangıç projesindeki aynı projede 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);
    }
}

Not

EFCore 5,0 öncesinde args parametre kullanılmıyor ( Bu sorunabakın). Bu, EFCore 5,0 ' de sabitlenmiştir ve diğer tasarım zamanı bağımsız değişkenleri uygulamaya Bu parametre aracılığıyla geçirilir.

Tasarım zamanı fabrikası, DbContext çalışma zamanından daha fazla tasarım zamanı için farklı yapılandırmanız gerekirse, DbContext Oluşturucu ek parametreler ALıRSA, di 'de kayıtlı değilse veya herhangi bir nedenden dolayı CreateHostBuilder ASP.NET Core uygulamanızın sınıfında bir yöntem olmaması gerekmiyorsa, özellikle kullanışlı olabilir Main .

Bağımsız Değişkenler

Hem hem de IDesignTimeDbContextFactory<TContext>.CreateDbContext Program.CreateHostBuilder komut satırı bağımsız değişkenlerini kabul edin.

EF Core 5,0 ' den başlayarak bu bağımsız değişkenleri araçlardan belirtebilirsiniz:

dotnet ef database update -- --environment Production

--Belirteç, dotnet ef bir bağımsız değişken olarak takip eden her şeyi kabul etmek ve bunları seçenekler olarak ayrıştırmaya çalışır. Tarafından kullanılmayan tüm ek bağımsız değişkenler dotnet ef uygulamaya iletilir.