O EntityFramework possui o recurso de migrations que ajuda demais no desenvolvimento de aplicações, pois com a abordagem do CodeFirst você vai criando as suas classes e ao rodar o migrations tudo é aplicado no banco de dados. Muito útil durante o desenvolvimento!
Até aí nada demais, inclusive eu já abordei o Migrations em diversos artigos aqui no blog, então onde está o problema ?
Azure Database Default Config
Quando você cria um banco de dados no Azure, por exemplo com o comando:
create database meubanco
O Azure cria o banco na instância padrão, que não é a mais barata, hoje ele cria na Gen5, veja so: Neste caso mais de 2 mil reais na data de hoje.
Mas porque isto acontece?
Quando você executa o migrations e o banco não existe, ele automaticamente é criado, e no caso do Azure ele cria na configuração padrão, ou seja, um descuido e você te um custo bem alto!
Dá para resolver?
Sim, e é bem simples na verdade, basta adicionar duas linhas no OnModelCreating do seu Contexto:
public class Contexto : DbContext
{
public Contexto(DbContextOptions<Contexto> options) : base(options) { }
public DbSet<Cliente> Cliente { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
// SQL Azure - Camada Basic
modelBuilder.HasServiceTier("Basic");
modelBuilder.HasPerformanceLevel("Basic");
}
}
Veja que os dois comandos abaixo:
modelBuilder.HasServiceTier("Basic");
modelBuilder.HasPerformanceLevel("Basic");
Eles informam ao migrations para modificar a camada do SQL para Basic que custa muito, muito menos, cerca de R$ 27,00 hoje!
No meu exemplo eu usei o Basic porque sempre começo um projeto no Azure com uma camada de banco bem pequena e barata, e a medida que o projeto cresce, vamos aumentando o tamanho do banco! Questão de economia!
Você pode conferir mais detalhes sobre os comandos aqui:
https://learn.microsoft.com/en-us/ef/core/providers/sql-server/azure-sql-database https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.sqlservermodelbuilderextensions.hasperformancelevel?view=efcore-7.0
Esta opção está disponível desde o EF Core 3.1
Considerações
O ideal neste caso é utilizar um usuário com acesso restrito ao banco e quando houver necessidade, o responsável pelo Azure pode criar o banco na camada correta, evitando todos estes problemas!
Agradecimentos ao Rafael Almeida com quem sempre tenho discussoes sensacionais sobre EntityFramework!
O código fonte deste exemplo pode ser encontrado no meu GitHub: https://github.com/carloscds/EntityFramework/tree/main/EFCoreDatabaseTier
Abraços e até a próxima!