Criação de tempo de design DbContextDesign-time DbContext Creation

Algumas das ferramentas EF comandos requerem uma instância de DbContext a ser criado no design de tempo (por exemplo, ao executar comandos de migrações).Some of the EF Tools commands require a DbContext instance to be created at design time (for example, when running Migrations commands). Há várias maneiras que de ferramentas tentam criá-la.There are various ways the tools try to create it.

De serviços de aplicativoFrom application services

Se seu projeto de inicialização é um aplicativo do 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. Eles obtiverem-lo chamando Program.BuildWebHost() e acessar o IWebHost.Services propriedade.They obtain it by invoking Program.BuildWebHost() and accessing the IWebHost.Services property. Qualquer DbContext registrado usando IServiceCollection.AddDbContext<TContext>() pode ser encontrado e criado dessa maneira.Any DbContext registered using IServiceCollection.AddDbContext<TContext>() can be found and created this way. Esse padrão foi introduzido no ASP.NET 2.0 de núcleoThis pattern was introduced in ASP.NET Core 2.0

Usando o construtor padrãoUsing the default constructor

Se o DbContext não pode ser obtido do provedor de serviço de aplicativo, as ferramentas de aparência para o tipo DbContext dentro do projeto.If the DbContext can't be obtained from the application service provider, the tools look for the DbContext type inside the project. Tente criá-la usando o construtor padrão.They try to create it using its default constructor.

Uma fábrica de tempo de designFrom a design-time factory

Você também pode informar as ferramentas como criar seu DbContext implementando IDesignTimeDbContextFactory.You can also tell the tools how to create your DbContext by implementing IDesignTimeDbContextFactory. Se uma classe que implemente essa interface foi encontrada no seu projeto, as ferramentas de ignoram outras maneiras de criar o DbContext.If a class implementing this interface is found inside your project, the tools bypass the other ways of creating the DbContext. Eles sempre usam a fábrica em tempo de design.They always use the factory at design time. Uma fábrica é especialmente útil se você precisa configurar o DbContext diferente para tempo de design que em tempo de execução.A factory is especially useful if you need to configure the DbContext differently for design time than at runtime.

using Microsoft.EntityFrameworkCore;
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 é usado no momento.The args parameter is currently unused. Não há um problema a capacidade de especificar argumentos de tempo de design de ferramentas de controle.There is an issue tracking the ability to specify design-time arguments from the tools.