Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Alguns dos comandos do EF Core Tools (por exemplo, os comandos Migrations ) exigem que uma instância derivada DbContext seja criada em tempo de design para reunir 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 assim criado seja configurado de forma semelhante à forma como seria configurado em tempo de execução.
Existem várias formas como as ferramentas tentam criar o DbContext. Se um IDesignTimeDbContextFactory<TContext> for encontrado, as ferramentas usam-no em vez dos outros padrões de criação. Uma fábrica em tempo de design é o padrão recomendado para um projeto de migração separado e para aplicações cujo projeto inicial é específico da plataforma.
Dos serviços de aplicações
Se seu projeto de inicialização usa o ASP.NET Core Web Host ou o .NET Core Generic Host, as ferramentas tentam 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, em seguida, 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 DbContext em si e quaisquer dependências no respetivo construtor precisam ser registados como serviços no fornecedor de serviços da aplicação. Isso pode ser facilmente alcançado por ter um construtor no DbContext que toma uma instância de DbContextOptions<TContext> como um 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. Este pode ser o construtor padrão se o DbContext é configurado usando o OnConfiguring método.
De uma fábrica em tempo de design
Você também pode dizer às ferramentas como criar seu DbContext implementando a Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<TContext> interface: 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 em tempo de design pode ser especialmente útil se o construtor de contexto tiver dependências que não estão registadas na DI, se não estiver a usar a DI, ou se o projeto de arranque da aplicação não puder ser executado pelas ferramentas.
Configure o mesmo fornecedor, opções de modelo e montagem de migrações em tempo de design que a aplicação usa em tempo de execução. Caso contrário, as ferramentas podem estruturar migrações para um modelo que difere do modelo utilizado pela aplicação. Não presuma que existe um argumento opcional na linha de comandos; Validar argumentos e fornecer uma fonte adequada de padrão ou configuração de desenvolvimento.
Args
Ambos IDesignTimeDbContextFactory<TContext>.CreateDbContext e Program.CreateHostBuilder aceitam argumentos de linha de comando.
Você pode especificar esses argumentos a partir das ferramentas:
dotnet ef database update -- --environment Production
O token -- direciona dotnet ef a 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.