Während der Entwurfszeit DbContext-InstanzerstellungDesign-time DbContext Creation

Einige der Befehle EF Core-Tools (z. B. die [Migrationen] 1 Befehle) erfordern eine abgeleitete DbContext Instanz zur Entwurfszeit erstellt werden, um Details zu der Anwendung zu sammeln. Entitätstypen und wie sie ein Datenbankschema zugeordnet.Some of the EF Core Tools commands (for example, the Migrations commands) require a derived DbContext instance to be created at design time in order to gather details about the application's entity types and how they map to a database schema. In den meisten Fällen ist es wünschenswert, die die DbContext dadurch erstellten erfolgt auf ähnliche Weise, wie es wäre zur Laufzeit konfiguriert.In most cases, it is desirable that the DbContext thereby created is configured in a similar way to how it would be configured at run time.

Es gibt verschiedene Möglichkeiten, versuchen die Tools zum Erstellen, der DbContext:There are various ways the tools try to create the DbContext:

Von Application-DiensteFrom application services

Wenn Startprojekt einer ASP.NET Core-app ist, werden diese Tools ausprobieren, um das DbContext-Objekt von der Anwendung Service-Anbieter zu erhalten.If your startup project is an ASP.NET Core app, the tools try to obtain the DbContext object from the application's service provider.

Die Tools verwenden Sie zunächst zum Abrufen des Dienstanbieters durch den Aufruf Program.BuildWebHost() und den Zugriff auf die IWebHost.Services Eigenschaft.The tools first try to obtain the service provider by invoking Program.BuildWebHost() and accessing the IWebHost.Services property.

Hinweis

Wenn Sie eine neue ASP.NET Core 2.0-Anwendung erstellen, ist dieser Hook standardmäßig enthalten.When you create a new ASP.NET Core 2.0 application, this hook is included by default. In früheren Versionen von EF Core und ASP.NET Core, versuchen die Tools, aufzurufen Startup.ConfigureServices direkt um Dienstanbieter der Anwendung, aber dieses Muster erhalten nicht mehr ordnungsgemäß in ASP.NET Core 2.0-Anwendungen funktioniert.In previous versions of EF Core and ASP.NET Core, the tools try to invoke Startup.ConfigureServices directly in order to obtain the application's service provider, but this pattern no longer works correctly in ASP.NET Core 2.0 applications. Wenn Sie ASP.NET Core 1.x-Anwendungen auf 2.0 aktualisieren, können Sie ändern Ihre Program Klasse, um dem neuen Muster folgen.If you are upgrading an ASP.NET Core 1.x application to 2.0, you can modify your Program class to follow the new pattern.

Die DbContext selbst und alle Abhängigkeiten in seinem Konstruktor als Dienste in der Anwendung Dienstanbieter registriert werden müssen.The DbContext itself and any dependencies in its constructor need to be registered as services in the application's service provider. Ganz einfach dafür, dass [ein Konstruktor für die DbContext , akzeptiert eine Instanz von DbContextOptions<TContext> als Argument] 4 und Verwenden der [ AddDbContext<TContext> -Methode] 5.This can be easily achieved by having a constructor on the DbContext that takes an instance of DbContextOptions<TContext> as an argument and using the AddDbContext<TContext> method.

Mithilfe eines Konstruktors ohne ParameterUsing a constructor with no parameters

Wenn "DbContext" aus der Dienstanbieter für die Anwendung abgerufen werden kann, suchen Sie die Tools für die abgeleitete DbContext Typ innerhalb des Projekts.If the DbContext can't be obtained from the application service provider, the tools look for the derived DbContext type inside the project. Versuchen sie, um eine Instanz mit einem Konstruktor ohne Parameter erstellen.Then they try to create an instance using a constructor with no parameters. Der Standardkonstruktor kann sein, wenn die DbContext erfolgt über die [ OnConfiguring ] 6 Methode.This can be the default constructor if the DbContext is configured using the OnConfiguring method.

Aus einer Factory zur EntwurfszeitFrom a design-time factory

Sie können auch erkennen die Tools wie Ihr "DbContext" Implementieren der IDesignTimeDbContextFactory<TContext> Schnittstelle: Wenn eine Klasse, die diese Schnittstelle implementiert, entweder in der gleichen Projekt wie das abgeleitete gefunden wird DbContext oder in der Anwendung Startprojekt, umgehen Sie die Tools Weitere Möglichkeiten erstellen Sie stattdessen die "DbContext" und die Verwendung der Entwurfszeit-Factory.You can also tell the tools how to create your DbContext by implementing the IDesignTimeDbContextFactory<TContext> interface: If a class implementing this interface is found in either the same project as the derived DbContext or in the application's startup project, the tools bypass the other ways of creating the DbContext and use the design-time factory instead.

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore.Infrastructure;

namespace MyProject
{
    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);
        }
    }
}

Hinweis

Die args Parameter wird derzeit nicht verwendet.The args parameter is currently unused. Es gibt [ein Problem] 7 verfolgen die Möglichkeit, die während der Entwurfszeit Argumente über die Tools angeben.There is an issue tracking the ability to specify design-time arguments from the tools.

Eine Entwurfszeit-Factory kann besonders hilfreich, wenn Sie die "DbContext" für die Entwurfszeit als zur Laufzeit unterschiedlich zu konfigurieren, wenn möchten sein der DbContext Attributkonstruktor verwendet, die zusätzliche Parameter sind nicht im DI registriert, wenn Sie DI nicht zu verwenden oder, wenn für einige Grund möchten nicht, dass eine BuildWebHost -Methode in Ihrer ASP.NET Core-Anwendung Main Klasse.A design-time factory can be especially useful if you need to configure the DbContext differently for design time than at run time, if the DbContext constructor takes additional parameters are not registered in DI, if you are not using DI at all, or if for some reason you prefer not to have a BuildWebHost method in your ASP.NET Core application's Main class.