Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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ů je žádoucí, aby DbContext, který byl takto vytvořen, byl nakonfigurován podobným způsobem, jako by byl nakonfigurován při běhu systému.
Existují různé způsoby, jak se nástroje pokusí vytvořit DbContext. Pokud se najde, IDesignTimeDbContextFactory<TContext> nástroje ho používají místo jiných vzorů vytváření. Doporučeným vzorem pro samostatný projekt migrace a pro aplikace, jejichž spouštěný projekt je specifický pro platformu, je doporučená továrna pro návrh.
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)
{
}
}
Note
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í konstruktoruDbContext, který přebírá instanci DbContextOptions<TContext> jako argument a používá metoduAddDbContext<TContext>.
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
Můžete také nástrojům říci, jak vytvořit DbContext, implementací rozhraní Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<TContext>: Pokud se ve stejném projektu jako odvozený DbContext nebo ve spouštěcím projektu aplikace nachází třída implementující toto rozhraní, nástroje pak obejdou ostatní způsoby vytvoření DbContext a použijí místo toho 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í v době návrhu může být užitečný zejména v případě, že kontextový konstruktor obsahuje závislosti, které nejsou zaregistrované v DI, pokud nepoužíváte DI nebo pokud spouštěcí projekt aplikace nemůže být spuštěn nástroji.
Konfigurace stejného zprostředkovatele, možností modelu a migrace sestavení v době návrhu, kterou aplikace používá za běhu. V opačném případě můžou nástroje generovat migrace pro model, který se liší od modelu používaného aplikací. Nepředpokládáme, že existuje volitelný argument příkazového řádku; ověřte argumenty a zadejte vhodný výchozí nebo konfigurační zdroj vývoje.
Args
Oba IDesignTimeDbContextFactory<TContext>.CreateDbContext a Program.CreateHostBuilder přijímají argumenty příkazového řádku.
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.