Tasarım Zamanında DbContext Oluşturma

EF Core Araçları 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şlentikleri hakkında ayrıntılı bilgi toplamak için tasarım zamanında türetilmiş bir örnek gerektirir. Çoğu durumda, oluşturulan bu şekilde çalışma zamanında yapılandırılana benzer bir DbContext şekilde DbContext

Araçların oluşturmak için çeşitli yolları DbContext vardır:

Uygulama hizmetlerinden

Başlangıç projeniz ASP.NET Core Web Ana Bilgisayarı veya .NET Core GenelAna Bilgisayarı kullanıyorsa, araçlar uygulamanın hizmet sağlayıcısından DbContext nesnesini elde etmeye dener.

Araçlar önce çağrısıyla hizmet sağlayıcısını elde etmeye ve Program.CreateHostBuilder() ardından Build() özelliğine erişmeyi Services dener.

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 uygulama ASP.NET Core, bu kanca varsayılan olarak dahil edilir.

Kendisi DbContext ve oluşturucusu olan tüm bağımlılıkların uygulamanın hizmet sağlayıcısında hizmet olarak kayıtlı olması gerekir. Bu, üzerinde bir örneğini bağımsız değişken olarak alan bir oluşturucuya sahip DbContextOptions<TContext> olarak ve yöntemi kullanılarak kolayca DbContextOptions<TContext>

Parametresiz bir oluşturucu kullanma

DbContext uygulama hizmet sağlayıcısından alınamasa, araçlar projenin içinde türetilmiş DbContext türü aramaz. Ardından parametresiz bir oluşturucu kullanarak örnek oluşturmayı denerler. yöntemi kullanılarak yapılandırılmışsa, DbContext bu varsayılan oluşturucu OnConfiguring olabilir.

Tasarım zamanı fabrikasından

Araçlara DbContext'inizi oluşturmak için Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory > arabirimini de kullanabilirsiniz: Bu arabirimi uygulayan bir sınıf türetilmiş projeyle 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ı DbContext 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'dan önce args parametresi kullanılmamıştı (bu args Bu, EFCore 5.0'da düzeltilmiştir ve ek tasarım zamanı bağımsız değişkenleri bu parametre aracılığıyla uygulamaya geçirilmiştir.

Tasarım zamanı fabrikası, tasarım zamanından farklı bir şekilde yapılandırmanız gerekiyorsa, oluşturucu ek parametreler alıyorsa DI'ye kayıtlı değilseniz veya herhangi bir nedenle ASP.NET Core uygulama sınıfınıza bir yönteme sahip olmayı tercih ediyorsanız özellikle yararlı DbContextDbContextCreateHostBuilderMain olabilir.

Bağımsız Değişkenler

Hem IDesignTimeDbContextFactory TContext > . CreateDbContext veProgram.CreateHostBuilder komut satırı bağımsız değişkenlerini kabul et.

5.0 EF Core başlayarak araçlardan şu bağımsız değişkenleri belirtebilirsiniz:

dotnet ef database update -- --environment Production

Belirteç, -- aşağıdaki her şeyi bağımsız değişken olarak kabul eder ve bunları seçenek olarak dotnet ef ayrıştırmayı denemez. tarafından kullanılmamış ek bağımsız dotnet ef değişkenler uygulamaya iletildi.