Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Einige der EF Core Tools-Befehle (z. B. die Migrationsbefehle ) erfordern die Erstellung einer abgeleiteten DbContext Instanz zur Entwurfszeit, um Details zu den Entitätstypen der Anwendung und deren Zuordnung zu einem Datenbankschema zu sammeln. In den meisten Fällen ist es wünschenswert, dass das DbContext dadurch erstellte Element auf ähnliche Weise konfiguriert wird, wie es zur Laufzeit konfiguriert wird.
Es gibt verschiedene Möglichkeiten, wie die Tools versuchen, die DbContext. Wenn ein IDesignTimeDbContextFactory<TContext> Fehler gefunden wird, verwenden die Tools sie anstelle der anderen Erstellungsmuster. Eine Entwurfszeitfactory ist das empfohlene Muster für ein separates Migrationsprojekt und für Anwendungen, deren Startprojekt plattformspezifisch ist.
Aus Anwendungsdiensten
Wenn Ihr Startprojekt den ASP.NET Core Web Host oder .NET Core Generic Host verwendet, versuchen die Tools, das DbContext-Objekt vom Dienstanbieter der Anwendung abzurufen.
Die Tools versuchen zuerst, den Dienstanbieter zu ermitteln, indem sie Program.CreateHostBuilder() aufrufen, Build() ausführen und dann auf die Eigenschaft Services zugreifen.
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
Wenn Sie eine neue ASP.NET Core-Anwendung erstellen, ist dieser Hook standardmäßig enthalten.
Das DbContext selbst und alle Abhängigkeiten in seinem Konstruktor müssen als Dienste im Dienstanbieter der Anwendung registriert werden. Dies kann ganz einfach erreicht werden, indem ein Konstruktor in der DbContext verwendet wird, der eine Instanz von DbContextOptions<TContext> als Argument nimmt und die AddDbContext<TContext> Methode angewendet wird.
Verwenden eines Konstruktors ohne Parameter
Wenn der DbContext nicht vom Anwendungsdienstanbieter abgerufen werden kann, suchen die Tools nach dem abgeleiteten DbContext Typ innerhalb des Projekts. Anschließend versuchen sie, eine Instanz mit einem Konstruktor ohne Parameter zu erstellen. Dies kann der Standardkonstruktor sein, wenn DbContext mit der OnConfiguring-Methode konfiguriert wird.
Von einer Entwurfszeit-Factory
Sie können auch die Tools angeben, wie Sie Ihren DbContext erstellen, indem Sie die Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<TContext> Schnittstelle implementieren: Wenn eine Klasse, die diese Schnittstelle implementiert, entweder in demselben Projekt wie das abgeleitete DbContext oder im Startprojekt der Anwendung gefunden wird, umgehen die Tools die anderen Methoden zum Erstellen von DbContext und verwenden stattdessen die Entwurfszeitfactory.
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);
}
}
Eine Entwurfszeitfactory kann besonders nützlich sein, wenn der Kontextkonstruktor Abhängigkeiten aufweist, die nicht in DI registriert sind, wenn Sie keine DI verwenden oder wenn das Anwendungsstartprojekt von den Tools nicht ausgeführt werden kann.
Konfigurieren Sie denselben Anbieter, Modelloptionen und Migrationsassembly zur Entwurfszeit, die von der Anwendung zur Laufzeit verwendet wird. Andernfalls können die Tools Gerüstmigrationen für ein Modell erstellen, das sich vom von der Anwendung verwendeten Modell unterscheidet. Gehen Sie nicht davon aus, dass ein optionales Befehlszeilenargument vorhanden ist; Validieren Sie Argumente, und stellen Sie eine geeignete Entwicklungsstandard- oder Konfigurationsquelle bereit.
Args
Beide Argumente IDesignTimeDbContextFactory<TContext>.CreateDbContext und Program.CreateHostBuilder akzeptieren Befehlszeilenargumente.
Sie können diese Argumente aus den Tools angeben:
dotnet ef database update -- --environment Production
Das ---Token weist dotnet ef an, alles Nachfolgende als Argument zu behandeln und nicht zu versuchen, es als Optionen zu parsen. Alle zusätzlichen Argumente, die von dotnet ef nicht verwendet werden, werden an die App weitergeleitet.