Criação de DbContext no tempo de designDesign-time DbContext Creation

Alguns dos comandos de ferramentas do EF Core (por exemplo, o migrações comandos) exigem um derivada DbContext instância a ser criada em tempo de design para obter detalhes sobre o aplicativo tipos de entidade e como eles são mapeados para um esquema de banco de dados.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. Na maioria dos casos, é desejável que o DbContext criado, portanto, está configurado de forma semelhante a como ele seria configurado no tempo de execução.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.

Há várias maneiras, as ferramentas de tentam criar o DbContext:There are various ways the tools try to create the DbContext:

Dos serviços de aplicativoFrom application services

Se seu projeto de inicialização é um aplicativo ASP.NET Core, as ferramentas de tentar obter o objeto DbContext do provedor de serviços do aplicativo.If your startup project is an ASP.NET Core app, the tools try to obtain the DbContext object from the application's service provider.

As ferramentas primeiro tentam obter o provedor de serviço invocando Program.BuildWebHost() e acessar o IWebHost.Services propriedade.The tools first try to obtain the service provider by invoking Program.BuildWebHost() and accessing the IWebHost.Services property.

Observação

Quando você cria um novo aplicativo ASP.NET Core 2.0, esse gancho é incluído por padrão.When you create a new ASP.NET Core 2.0 application, this hook is included by default. Nas versões anteriores do EF Core e ASP.NET Core, as ferramentas de tentarem invocar Startup.ConfigureServices diretamente para obter o provedor de serviços do aplicativo, mas esse padrão não funciona corretamente em aplicativos 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. Se você estiver atualizando um aplicativo ASP.NET Core 1.x 2.0, você poderá modificar sua Program classe seguir o padrão de novos.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.

O DbContext em si e todas as dependências em seu construtor precisam ser registrados como serviços no provedor de serviços do aplicativo.The DbContext itself and any dependencies in its constructor need to be registered as services in the application's service provider. Isso pode ser feito facilmente tendo um construtor na DbContext que usa uma instância do DbContextOptions<TContext> como um argumento e usando o AddDbContext<TContext> método.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.

Usando um construtor sem parâmetrosUsing a constructor with no parameters

Se o DbContext não pode ser obtido do provedor de serviço de aplicativo, as ferramentas procure derivado DbContext tipo dentro do projeto.If the DbContext can't be obtained from the application service provider, the tools look for the derived DbContext type inside the project. Em seguida, tente criar uma instância usando um construtor sem parâmetros.Then they try to create an instance using a constructor with no parameters. Isso pode ser o construtor padrão se o DbContext é configurado usando o OnConfiguring método.This can be the default constructor if the DbContext is configured using the OnConfiguring method.

De uma fábrica de tempo de designFrom a design-time factory

Você também pode informar as ferramentas de como criar o DbContext, Implementando a IDesignTimeDbContextFactory<TContext> interface: se uma classe que implementa essa interface for encontrada no mesmo projeto derivado DbContext ou no projeto de inicialização do aplicativo, as ferramentas de ignoram outras maneiras de criar o DbContext e o uso a fábrica de tempo de design em vez disso.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);
        }
    }
}

Observação

O args parâmetro está sendo utilizado.The args parameter is currently unused. Não há um problema a capacidade de especificar argumentos de tempo de design das ferramentas de acompanhamento.There is an issue tracking the ability to specify design-time arguments from the tools.

Uma fábrica de tempo de design pode ser especialmente útil se você precisar configurar o DbContext de forma diferente para o tempo de design que em tempo de execução, se o DbContext leva construtor parâmetros adicionais não são registrados na DI, se você não estiver usando injeção de dependência em todos os ou se para alguns motivo você prefere não ter uma BuildWebHost método do seu aplicativo 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.