Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Alguns dos comandos do EF Core Tools (por exemplo, os comandos de Migrações ) exigem que uma instância derivada DbContext seja criada em tempo de design para coletar detalhes sobre os tipos de entidade do aplicativo e como eles são mapeados para um esquema de banco de dados. Na maioria dos casos, é desejável que o DbContext criado seja configurado de maneira semelhante à forma como ele seria configurado em tempo de execução.
Há várias maneiras pelas quais as ferramentas tentam criar o DbContext. Se um IDesignTimeDbContextFactory<TContext> for encontrado, as ferramentas o usarão em vez dos outros padrões de criação. Uma fábrica de tempo de design é o padrão recomendado para um projeto de migrações separado e para aplicativos cujo projeto de inicialização é específico da plataforma.
Dos serviços de aplicações
Se o projeto de inicialização usar o Host Web do ASP.NET Core ou o Host Genérico do .NET Core, as ferramentas tentarão obter o objeto DbContext do provedor de serviços do aplicativo.
As ferramentas primeiro tentam obter o provedor de serviços invocando Program.CreateHostBuilder(), chamando Build()e acessando a Services propriedade.
public class Program
{
public static void Main(string[] args)
=> CreateHostBuilder(args).Build().Run();
// EF Core uses this method at design time to access the DbContext
public static IHostBuilder CreateHostBuilder(string[] args)
=> Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(
webBuilder => webBuilder.UseStartup<Startup>());
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
=> services.AddDbContext<ApplicationDbContext>();
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
}
}
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
Note
Quando você cria um novo aplicativo ASP.NET Core, esse gancho é incluído por padrão.
O próprio DbContext e quaisquer dependências em seu construtor precisam ser registrados como serviços no provedor de serviços do aplicativo. Isso pode ser facilmente alcançado tendo um construtor no DbContext que recebe uma instância de DbContextOptions<TContext> como argumento e usando o AddDbContext<TContext> método.
Usando um construtor sem parâmetros
Se o DbContext não puder ser obtido do provedor de serviços de aplicativo, as ferramentas procurarão o tipo derivado DbContext dentro do projeto. Em seguida, eles tentam criar uma instância usando um construtor sem parâmetros. Esse pode ser o construtor padrão se ele DbContext estiver configurado usando o OnConfiguring método.
De uma fábrica de tempo de design
Você também pode informar às ferramentas como criar seu DbContext implementando a interface Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<TContext>: se uma classe que implementa essa interface for encontrada no mesmo projeto que o derivado DbContext ou no projeto de inicialização do aplicativo, as ferramentas ignorarão as outras maneiras de criar o DbContext e usarão a fábrica de tempo de design.
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);
}
}
Uma fábrica de tempo de design pode ser especialmente útil se o construtor de contexto tiver dependências que não estão registradas no DI, se você não estiver usando DI ou se o projeto de inicialização do aplicativo não puder ser executado pelas ferramentas.
Configure o mesmo provedor, opções de modelo e assembly de migrações no tempo de design que o aplicativo usa em tempo de execução. Caso contrário, as ferramentas podem estruturar migrações para um modelo diferente do modelo usado pelo aplicativo. Não suponha que um argumento de linha de comando opcional esteja presente; valide argumentos e forneça uma fonte de configuração ou padrão de desenvolvimento adequada.
Args
Tanto IDesignTimeDbContextFactory<TContext>.CreateDbContext quanto Program.CreateHostBuilder aceitam argumentos de linha de comando.
Você pode especificar esses argumentos das ferramentas:
dotnet ef database update -- --environment Production
O token -- direciona dotnet ef para tratar tudo o que se segue como um argumento e não tentar analisá-los como opções. Todos os argumentos extras não usados por dotnet ef são encaminhados para o aplicativo.