# DV-004: Configuración Base de Datos **Proyecto:** Sistema de Registro de Estudiantes **Fecha:** 2026-01-07 --- ## 1. Docker Compose (SQL Server) ```yaml # deploy/docker/docker-compose.yml services: sqlserver: image: mcr.microsoft.com/mssql/server container_name: sqlserver-students environment: - ACCEPT_EULA=Y - SA_PASSWORD=${DB_PASSWORD:-YourStrong@Passw0rd} - MSSQL_PID=Developer ports: - "1433:1433" volumes: - sqlserver-data:/var/opt/mssql healthcheck: test: /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "$$SA_PASSWORD" -C -Q "SELECT 1" interval: 10s timeout: 5s retries: 5 volumes: sqlserver-data: ``` --- ## 2. Comandos Docker ```bash # Iniciar SQL Server docker-compose -f deploy/docker/docker-compose.yml up -d sqlserver # Ver logs docker logs sqlserver-students # Conectar a SQL Server docker exec -it sqlserver-students /opt/mssql-tools18/bin/sqlcmd \ -S localhost -U sa -P 'YourStrong@Passw0rd' -C # Detener docker-compose -f deploy/docker/docker-compose.yml down ``` --- ## 3. Connection String ```json // appsettings.Development.json { "ConnectionStrings": { "DefaultConnection": "Server=localhost;Database=StudentEnrollment;User Id=sa;Password=YourStrong@Passw0rd;TrustServerCertificate=True" } } ``` --- ## 4. DbContext Configuration ```csharp // Adapters/Driven/Persistence/Context/AppDbContext.cs public class AppDbContext : DbContext { public AppDbContext(DbContextOptions options) : base(options) { } public DbSet Students => Set(); public DbSet Subjects => Set(); public DbSet Professors => Set(); public DbSet Enrollments => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly); } } ``` --- ## 5. Registrar DbContext ```csharp // Adapters/Driven/Persistence/DependencyInjection.cs public static class DependencyInjection { public static IServiceCollection AddPersistence( this IServiceCollection services, IConfiguration configuration) { services.AddDbContext(options => options.UseSqlServer( configuration.GetConnectionString("DefaultConnection"))); services.AddScoped(); services.AddScoped(); services.AddScoped(); return services; } } ``` --- ## 6. Migraciones ```bash # Crear migración inicial dotnet ef migrations add InitialCreate \ -p src/backend/Adapters.Driven.Persistence \ -s src/backend/Host # Aplicar migración dotnet ef database update \ -p src/backend/Adapters.Driven.Persistence \ -s src/backend/Host # Generar script SQL dotnet ef migrations script \ -p src/backend/Adapters.Driven.Persistence \ -s src/backend/Host \ -o database/scripts/create.sql ``` --- ## 7. Seed Data ```csharp // Adapters/Driven/Persistence/Seeding/DataSeeder.cs public static class DataSeeder { public static void Seed(ModelBuilder modelBuilder) { // Profesores modelBuilder.Entity().HasData( new { Id = 1, Name = "Dr. García" }, new { Id = 2, Name = "Dra. Martínez" }, new { Id = 3, Name = "Dr. López" }, new { Id = 4, Name = "Dra. Rodríguez" }, new { Id = 5, Name = "Dr. Hernández" } ); // Materias (2 por profesor) modelBuilder.Entity().HasData( new { Id = 1, Name = "Matemáticas I", Credits = 3, ProfessorId = 1 }, new { Id = 2, Name = "Matemáticas II", Credits = 3, ProfessorId = 1 }, new { Id = 3, Name = "Física I", Credits = 3, ProfessorId = 2 }, new { Id = 4, Name = "Física II", Credits = 3, ProfessorId = 2 }, new { Id = 5, Name = "Programación I", Credits = 3, ProfessorId = 3 }, new { Id = 6, Name = "Programación II", Credits = 3, ProfessorId = 3 }, new { Id = 7, Name = "Base de Datos I", Credits = 3, ProfessorId = 4 }, new { Id = 8, Name = "Base de Datos II", Credits = 3, ProfessorId = 4 }, new { Id = 9, Name = "Redes I", Credits = 3, ProfessorId = 5 }, new { Id = 10, Name = "Redes II", Credits = 3, ProfessorId = 5 } ); } } ```