Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Vissa av EF Core Tools-kommandona (till exempel migreringskommandon ) kräver att en härledd DbContext instans skapas vid designtillfället för att samla in information om programmets entitetstyper och hur de mappas till ett databasschema. I de flesta fall är det önskvärt att den DbContext därmed skapade konfigureras på ett liknande sätt som det skulle konfigureras vid körning.
Det finns olika sätt som verktygen försöker skapa DbContext:
Från programtjänster
Om startprojektet använder ASP.NET Core Web Host eller .NET Core Generic Host försöker verktygen hämta DbContext-objektet från programmets tjänstleverantör.
Verktygen försöker först hämta tjänstleverantören genom att Program.CreateHostBuilder()anropa , anropa Build()och sedan komma åt Services egenskapen.
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
När du skapar ett nytt ASP.NET Core-program ingår den här kroken som standard.
Själva DbContext och eventuella beroenden i konstruktorn måste registreras som tjänster i programmets tjänstleverantör. Detta kan enkelt uppnås genom att ha en konstruktor på DbContext som tar en instans av DbContextOptions<TContext> som ett argument och använder AddDbContext<TContext> metoden.
Använda en konstruktor utan parametrar
Om DbContext inte kan hämtas från programtjänstleverantören letar verktygen efter den härledda DbContext typen i projektet. Sedan försöker de skapa en instans med hjälp av en konstruktor utan parametrar. Detta kan vara standardkonstruktorn om den DbContext har konfigurerats med hjälp av OnConfiguring metoden.
Från en design-tidsfabrik
Du kan också berätta för verktygen hur du skapar din DbContext genom att implementera Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<TContext> gränssnittet: Om en klass som implementerar det här gränssnittet finns i antingen samma projekt som härledda DbContext eller i programmets startprojekt, kringgår verktygen de andra sätten att skapa DbContext och använder designtidsfabriken i stället.
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);
}
}
En design-time-fabrik kan vara särskilt användbar om du behöver konfigurera DbContext på ett annat sätt för designtid än vid körning, om DbContext konstruktorn tar ytterligare parametrar inte är registrerade i DI, om du inte använder DI alls, eller om du av någon anledning föredrar att inte ha en CreateHostBuilder metod i din ASP.NET Core-programmets Main klass.
Args
Både IDesignTimeDbContextFactory<TContext>.CreateDbContext och Program.CreateHostBuilder accepterar kommandoradsargument.
Du kan ange dessa argument från verktygen:
dotnet ef database update -- --environment Production
Det ---token dirigerar dotnet ef att behandla allt som följer som ett argument och inte försöka parsa dem som alternativ. Eventuella extra argument som inte används av dotnet ef vidarebefordras till appen.