Vytváření DbContext v době návrhu

Některé příkazy EF Core Tools (například příkazy migrace) vyžadují vytvoření odvozené DbContext instance v době návrhu, aby se shromáždily podrobnosti o typech entit aplikace a o tom, jak se mapují na schéma databáze. Ve většiněpřípadůch DbContext

Existují různé způsoby, jak se nástroje pokusí vytvořit DbContext:

Z aplikačních služeb

Pokud váš spouštěný projekt používá ASP.NET Core Web Host nebo .NET Core Generic Host, nástroje se pokusí získat objekt DbContext od poskytovatele služeb aplikace.

Nástroje se nejprve pokusí získat poskytovatele služeb vyvoláním Program.CreateHostBuilder(), voláním Build()a následným přístupem k Services vlastnosti.

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)
    {
    }
}

Poznámka

Když vytvoříte novou aplikaci ASP.NET Core, bude tento háček ve výchozím nastavení zahrnutý.

Samotný DbContext a všechny závislosti v jeho konstruktoru musí být registrovány jako služby v poskytovateli služeb aplikace. Toho lze snadno dosáhnout pomocí konstruktoru, který přebírá instanci DbContextOptions<TContext> jako argument a používá metoduAddDbContext<TContext>.DbContext

Použití konstruktoru bez parametrů

Pokud DbContext nelze získat od poskytovatele aplikační služby, nástroje hledají odvozený DbContext typ v projektu. Pak se pokusí vytvořit instanci pomocí konstruktoru bez parametrů. To může být výchozí konstruktor, pokud DbContext je nakonfigurován pomocí OnConfiguring metody.

Z továrny v době návrhu

Nástroje, jak vytvořit DbContext, můžete také říct implementací Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<TContext> rozhraní: Pokud třída implementovaná toto rozhraní se nachází buď ve stejném projektu jako odvozený DbContext nebo ve spouštěcím projektu aplikace, nástroje obcházejí další způsoby vytvoření DbContext a místo toho používají továrnu pro návrh.

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);
    }
}

Objekt pro vytváření návrhu může být užitečný zejména v případě, že potřebujete pro čas návrhu DbContext nakonfigurovat odlišnou dobu než v době běhu, pokud DbContext konstruktor přijímá další parametry, nejsou registrovány v DI, pokud vůbec nepoužíváte DI nebo pokud z nějakého důvodu nechcete mít metodu CreateHostBuilder ve třídě aplikace ASP.NET Core Main .

Args

Oba IDesignTimeDbContextFactory<TContext>.CreateDbContext argumenty příkazového řádku a Program.CreateHostBuilder přijmout je.

Tyto argumenty můžete zadat z nástrojů:

dotnet ef database update -- --environment Production

Token -- směruje dotnet ef na zpracování všeho, co následuje jako argument, a nepokouší se je analyzovat jako možnosti. Všechny nadbytečné argumenty, které dotnet ef aplikace nepoužívá, se předávají do aplikace.