Création de DbContext d’au moment du designDesign-time DbContext Creation

Certaines commandes outils EF Core (par exemple, le Migrations commandes) nécessitent une dérivée DbContext instance doit être créé au moment du design afin de collecter des informations détaillées sur l’application types d’entité et comment elles correspondent à 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éée 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 d’essayer 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.

Les outils essayer tout d’abord d’obtenir le fournisseur de services en appelant Program.BuildWebHost() et l’accès à la IWebHost.Services propriété.The tools 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 d’EF Core et ASP.NET Core, les outils tentez d’appeler Startup.ConfigureServices directement afin d’obtenir de 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 1.x de ASP.NET Core 2.0, vous pouvez modifier votre Program classe à suivre le nouveau modèle.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 les dépendances dans son constructeur doivent être inscrits en tant que services dans le fournisseur de services de l’application.The DbContext itself and any dependencies in its constructor need to be registered as services in the application's service provider. Vous pouvez facilement faire en ayant un constructeur sur la DbContext qui prend une instance de DbContextOptions<TContext> en tant qu’argument et à l’aide de la AddDbContext<TContext> (méthode).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.

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

Si le DbContext ne peut pas être obtenu à partir du fournisseur de service d’application, les outils Recherchez dérivé DbContext type 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. Puis, ils tentent 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. Il peut s’agir du constructeur par défaut si le DbContext est configuré à l’aide de la OnConfiguring (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 aux outils comment créer 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 pas utilisé.The args parameter is currently unused. Il est un problème 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 paramètres supplémentaires ne sont pas inscrits dans l’injection de dépendances, si vous n’utilisez pas du tout l’injection de dépendances, ou si pour certains vous préférez ne pas avoir de raison un BuildWebHost méthode dans votre application ASP.NET Core Main classe.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.