Au moment du design DbContext créationDesign-time DbContext Creation

Certaines commandes EF principaux outils (par exemple, le [Migrations] 1 commandes) nécessitent une dérivée DbContext instance doit être créé au moment du design afin de regrouper des informations sur l’application types d’entité et comment ils sont mappés à un schéma de base de données.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. Dans la plupart des cas, il est souhaitable que le DbContext ainsi créé est configuré de manière similaire à la façon dont il serait configuré au moment de l’exécution.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.

Il existe différentes façons les outils essaie de créer le DbContext:There are various ways the tools try to create the DbContext:

À partir des services d’applicationFrom application services

Si votre projet de démarrage est une application ASP.NET Core, les outils de tenter d’obtenir l’objet DbContext à partir du fournisseur de services de l’application.If your startup project is an ASP.NET Core app, the tools try to obtain the DbContext object from the application's service provider.

L’outil tentent tout d’abord obtenir le fournisseur de service en appelant Program.BuildWebHost() et l’accès à la IWebHost.Services propriété.The tool first try to obtain the service provider by invoking Program.BuildWebHost() and accessing the IWebHost.Services property.

Note

Lorsque vous créez une nouvelle application ASP.NET Core 2.0, ce hook est inclus par défaut.When you create a new ASP.NET Core 2.0 application, this hook is included by default. Dans les versions précédentes de EF Core et ASP.NET Core, les outils tentent d’appeler Startup.ConfigureServices directement afin d’obtenir le fournisseur de services de l’application, mais ce modèle n’est plus fonctionne correctement dans les applications ASP.NET Core 2.0.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. Si vous mettez à niveau une application ASP.NET Core 1.x 2.0, vous pouvez modifier votre Program à suivre le nouveau modèle de classe.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.

Le DbContext lui-même et toutes les dépendances dans son constructeur doivent être enregistrés en tant que services dans le fournisseur de service de l’application.The DbContext itself and any dependencies in its constructor need to be registered as services in the application's service provider. Cela peut être facilement atteints en ayant [un constructeur sur le DbContext qui accepte une instance de DbContextOptions<TContext> en tant qu’argument] 4 et à l’aide de la [ AddDbContext<TContext> (méthode)] 5.This can be easily achieved by having a constructor on the DbContext that takes an instance of DbContextOptions<TContext> as a argument and using the AddDbContext<TContext> method.

À l’aide d’un constructeur sans paramètreUsing a constructor with no parameters

Si le DbContext ne peut pas être obtenu à partir du fournisseur de service d’application, les outils de recherche dérivé DbContext type situé dans le projet.If the DbContext can't be obtained from the application service provider, the tools look for the derived DbContext type inside the project. Ils tenteront de créer une instance à l’aide d’un constructeur sans paramètre.Then they try to create an instance using a constructor with no parameters. Cela peut être le constructeur par défaut si le DbContext est configuré à l’aide de la [ OnConfiguring ] 6 (méthode).This can be the default constructor if the DbContext is configured using the OnConfiguring method.

À partir d’une fabrique au moment du designFrom a design-time factory

Vous pouvez également indiquer les outils de la création de votre DbContext en implémentant la IDesignTimeDbContextFactory<TContext> interface : si une classe qui implémente cette interface se trouve dans le même projet que dérivé DbContext ou dans le projet de démarrage de l’application, les outils de contournement les autres méthodes de création de DbContext et utiliser la fabrique au moment du design à la place.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);
        }
    }
}

Note

Le args paramètre est actuellement inutilisé.The args parameter is currently unused. Il est [un problème] 7 la possibilité de spécifier des arguments au moment du design à partir des outils de suivi.There is an issue tracking the ability to specify design-time arguments from the tools.

Une fabrique au moment du design peut être particulièrement utile si vous avez besoin configurer le DbContext différemment pour le moment du design qu’au moment de l’exécution, si le DbContext prend constructeur des paramètres supplémentaires ne sont pas inscrits dans DI, si vous n’utilisez pas du tout DI, ou si certaines vous préférez ne pas avoir de raison un BuildWebHost dans votre application ASP.NET Core (méthode)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
Classe Main.Main class.