🚀 Automatiza Tus Migraciones Pendientes de Base de Datos en Azure con .NET! 🛠️

🚀 Automatiza Tus Migraciones Pendientes de Base de Datos en Azure con .NET! 🛠️

Descubre cómo simplificar las actualizaciones de tu base de datos SQL en Azure utilizando .NET

Introducción:

Este post se centra en una herramienta invaluable para cualquier arquitecto de soluciones en Azure: las migraciones automáticas de bases de datos utilizando .NET. Acompáñame para explorar cómo esta funcionalidad no solo facilita el trabajo sino que optimiza todo el ciclo de vida de las aplicaciones.

¿Qué es este servicio?:

El servicio específico de Azure que discutiremos hoy es el Azure SQL Database junto con Entity Framework Core para la gestión de esquemas de base de datos. Azure SQL Database es un servicio de base de datos relacional basado en la nube que facilita y agiliza la gestión de bases de datos, asegurando alta disponibilidad, seguridad, y escalabilidad. Entity Framework Core, por otro lado, es un ORM (Object-Relational Mapper) moderno que permite a los desarrolladores de .NET interactuar con bases de datos utilizando objetos de .NET, y es especialmente útil para manejar migraciones de esquema de forma automática.

¿Qué cubrirá este post?:

  1. Introducción a Azure SQL Database y Entity Framework Core.

  2. Configuración inicial para habilitar migraciones automáticas.

  3. Ejemplo de cómo ejecutar migraciones automáticamente al iniciar una aplicación.

¿Por qué es importante para los arquitectos de soluciones?:

Para los arquitectos de soluciones en Azure, mantener los esquemas de base de datos actualizados y sincronizados con el desarrollo de aplicaciones es fundamental. La capacidad de ejecutar migraciones automáticas al iniciar aplicaciones en .NET reduce significativamente el riesgo de errores humanos, disminuye el tiempo de inactividad y asegura una implementación coherente y controlada en todos los entornos, desde desarrollo hasta producción.

¿Qué problemas puede resolver?:

Las migraciones automáticas resuelven varios problemas críticos:

  • Desincronización entre el código y la base de datos: Garantiza que las modificaciones en el modelo de datos se reflejen automáticamente en la base de datos.

  • Errores manuales en la gestión de bases de datos: Minimiza los errores humanos al automatizar las actualizaciones.

  • Dificultades en el manejo de múltiples entornos: Simplifica la gestión de esquemas en diferentes entornos, asegurando consistencia y reduciendo problemas durante las implementaciones.

Ejercicio en Práctica

  1. Utilizaremos el mismo proyecto que usamos en el post anterior que esta desarrollado en .Net 7 con la siguiente estructura.

  1. Crearemos la entidad Users.cs con las siguientes propiedades y crearemos una primera migracion con el siguiente comando.
dotnet ef migrations add CreateTableUsers

  1. Ahora crearemos la siguiente Entidad "Producto" y haremos la migracion
dotnet ef migrations add CreateTableProducto

  1. Ahora crearemos una relacion de uno a muchos, para ello agregamos en la entidad users una lista de productos

  1. En la entidad "Productos" añadiremos el UserId de la entidad users y creamos la 3era migración.

dotnet ef migrations add RelateUsersAndProduct
  1. Vemos que ya en nuestra carpeta migrations, vemos que ya existen las migraciones creadas

  1. Ahora vamos a nuestro archivo Program.cs y añadiremos este bloque de codigo justo debajo de haber declarado la variable app quedando de la siguiente manera
using Microsoft.EntityFrameworkCore;
using UserService.Repository.Models;
using UserService.Repository.Repositories;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
// Add services to the container.
builder.Services.AddDbContext<ApplicationDbContext>();
builder.Services.AddScoped<IUserRepository, UserRepository>();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();

using(var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;
    try
    {
        var context = services.GetRequiredService<ApplicationDbContext>();
        context.Database.Migrate();
    }
    catch (Exception ex)
    {
        var logger = services.GetRequiredService<ILogger<Program>>();
        logger.LogError(ex, "An error occurred while migrating or seeding the database.");
    }
}

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

var services = scope.ServiceProvider;

El proveedor de servicios es el componente que resuelve las dependencias en base a los registros en el contenedor de DI.

var context = services.GetRequiredService<ApplicationDbContext>();

Utiliza el proveedor de servicios para recuperar una instancia de la clase ApplicationDbContext

El método GetRequiredService lanza una excepción si el servicio solicitado (ApplicationDbContext) no está registrado en el contenedor de DI. Esto asegura que el contexto siempre esté disponible para fines de migración.

context.Database.Migrate();

Invoca el método Migrate en la instancia de la base de datos asociada con ApplicationDbContext. Este método lee las migraciones de base de datos definidas (generalmente almacenadas en una carpeta Migrations) y las aplica a tu base de datos, creando o modificando tablas y columnas según sea necesario para alinearlas con tus modelos de datos.

  1. Nos conectamos a la base de datos y vemos que esta vacía.

  1. Ahora ejecutaremos el programa

  1. Revisamos la Base de datos nuevamente, y vemos que ya las tablas y relaciones fueron creadas.

Consideraciones finales:

Implementar migraciones automáticas con Azure SQL Database y .NET puede transformar la manera en que gestionas las bases de datos en tus proyectos. No solo optimiza los procesos, sino que también proporciona una base sólida para aplicaciones robustas y escalables.

Te invito a experimentar con estas herramientas y a compartir tus experiencias y aprendizajes.