Normalmente, quando trabalhamos com **EF Core** e **Migrations,** precisamos rodar comandos manualmente para aplicar mudanças no banco de dados do projeto, como: dotnet ef migrations add NomeDaMigracao
e dotnet ef database update
. O código apresentado automatiza esse processo, garantindo que qualquer alteração na estrutura do banco (nova tabela, coluna, chave estrangeira, etc.) seja aplicada na inicialização do sistema.
Vamos usar a base do exemplo do artigo de como configurar conexão do banco de dados e adicionar mais um método. Ele será chamado de UseDatabaseConfiguration
. Ele é um método de extensão que, ao ser chamado durante o ciclo de vida da aplicação, garante que o banco de dados seja configurado corretamente, migrado e se necessário criado.
public static class DataBaseConfig
{
public static void AddDataBaseConfiguration(this IServiceCollection services, IConfiguration configuration)
{
services.
AddDbContext<ALContext>(options =>
options.UseSqlServer(configuration.GetConnectionString("ALConnection")));
}
public static void UseDatabaseConfiguration(this IApplicationBuilder app)
{
using var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope();
using var context = serviceScope.ServiceProvider.GetService<TFContext>();
if (context == null)
throw new InvalidOperationException("O contexto do banco de dados não pôde ser resolvido. Verifique a injeção de dependência.");
context.Database.Migrate();
}
}
ALContext
, evitando problemas de ciclo de vida da injeção de dependência.DbContext
do banco de dados (ALContext
).context.Database.Migrate();
).No arquivo Program.cs
ou Startup.cs
, chamamos esses métodos para garantir que o banco de dados seja configurado e atualizado corretamente:
using AL.WebApi.Configuration;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// 🔥 Adiciona a configuração do banco na injeção de dependência
**builder.Services.AddDataBaseConfiguration(builder.Configuration);**
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
// 🔥 Garante que o banco está atualizado ao iniciar o sistema
**app.UseDatabaseConfiguration();**
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();