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.