107 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| // src/Elecciones.Database/EleccionesDbContext.cs
 | |
| using Elecciones.Database.Entities;
 | |
| using Microsoft.EntityFrameworkCore;
 | |
| 
 | |
| namespace Elecciones.Database;
 | |
| 
 | |
| public class EleccionesDbContext(DbContextOptions<EleccionesDbContext> options) : DbContext(options)
 | |
| {
 | |
|     public DbSet<AgrupacionPolitica> AgrupacionesPoliticas { get; set; }
 | |
|     public DbSet<AmbitoGeografico> AmbitosGeograficos { get; set; }
 | |
|     public DbSet<ResultadoVoto> ResultadosVotos { get; set; }
 | |
|     public DbSet<EstadoRecuento> EstadosRecuentos { get; set; }
 | |
|     public DbSet<ProyeccionBanca> ProyeccionesBancas { get; set; }
 | |
|     public DbSet<Telegrama> Telegramas { get; set; }
 | |
|     public DbSet<ResumenVoto> ResumenesVotos { get; set; }
 | |
|     public DbSet<EstadoRecuentoGeneral> EstadosRecuentosGenerales { get; set; }
 | |
|     public DbSet<CategoriaElectoral> CategoriasElectorales { get; set; }
 | |
|     public DbSet<AdminUser> AdminUsers { get; set; }
 | |
|     public DbSet<Configuracion> Configuraciones { get; set; }
 | |
|     public DbSet<Bancada> Bancadas { get; set; }
 | |
|     public DbSet<OcupanteBanca> OcupantesBancas { get; set; }
 | |
|     public DbSet<LogoAgrupacionCategoria> LogosAgrupacionesCategorias { get; set; }
 | |
|     public DbSet<CandidatoOverride> CandidatosOverrides { get; set; }
 | |
|     public DbSet<Eleccion> Elecciones { get; set; }
 | |
|     public DbSet<BancaPrevia> BancasPrevias { get; set; }
 | |
| 
 | |
|     protected override void OnModelCreating(ModelBuilder modelBuilder)
 | |
|     {
 | |
|         base.OnModelCreating(modelBuilder);
 | |
| 
 | |
|         modelBuilder.UseCollation("Modern_Spanish_CI_AS");
 | |
| 
 | |
|         modelBuilder.Entity<Eleccion>(entity =>
 | |
|         {
 | |
|             // Le decimos a EF que proporcionaremos el valor de la clave primaria.
 | |
|             // Esto evita que la configure como una columna IDENTITY en SQL Server.
 | |
|             entity.Property(e => e.Id).ValueGeneratedNever();
 | |
|         });
 | |
| 
 | |
|         modelBuilder.Entity<ResultadoVoto>()
 | |
|         .HasIndex(r => new { r.AmbitoGeograficoId, r.CategoriaId, r.AgrupacionPoliticaId })
 | |
|         .IsUnique();
 | |
| 
 | |
|         // Precisión para los campos de porcentaje en EstadoRecuento
 | |
|         modelBuilder.Entity<EstadoRecuento>(entity =>
 | |
|         {
 | |
|             entity.HasKey(e => new { e.AmbitoGeograficoId, e.CategoriaId });
 | |
|             entity.Property(e => e.MesasTotalizadasPorcentaje).HasPrecision(5, 2);
 | |
|             entity.Property(e => e.ParticipacionPorcentaje).HasPrecision(5, 2);
 | |
|             entity.Property(e => e.VotosNulosPorcentaje).HasPrecision(18, 4);
 | |
|             entity.Property(e => e.VotosEnBlancoPorcentaje).HasPrecision(18, 4);
 | |
|             entity.Property(e => e.VotosRecurridosPorcentaje).HasPrecision(18, 4);
 | |
|         });
 | |
| 
 | |
|         // Precisión para el campo de porcentaje en ResultadoVoto
 | |
|         modelBuilder.Entity<ResultadoVoto>()
 | |
|             .Property(e => e.PorcentajeVotos).HasPrecision(18, 4);
 | |
| 
 | |
|         modelBuilder.Entity<ResumenVoto>()
 | |
|             .Property(e => e.VotosPorcentaje).HasPrecision(5, 2);
 | |
| 
 | |
|         modelBuilder.Entity<EstadoRecuentoGeneral>(entity =>
 | |
|         {
 | |
|             // Le decimos a EF que la combinación única es (AmbitoGeograficoId, CategoriaId)
 | |
|             entity.HasKey(e => new { e.AmbitoGeograficoId, e.CategoriaId });
 | |
| 
 | |
|             // Mantener la configuración de precisión
 | |
|             entity.Property(e => e.MesasTotalizadasPorcentaje).HasPrecision(5, 2);
 | |
|             entity.Property(e => e.ParticipacionPorcentaje).HasPrecision(5, 2);
 | |
|         });
 | |
|         modelBuilder.Entity<ProyeccionBanca>(entity =>
 | |
|         {
 | |
|             // La combinación de ámbito, categoría y agrupación debe ser única.
 | |
|             entity.HasIndex(p => new { p.AmbitoGeograficoId, p.CategoriaId, p.AgrupacionPoliticaId })
 | |
|                   .IsUnique();
 | |
|         });
 | |
|         modelBuilder.Entity<Bancada>(entity =>
 | |
|         {
 | |
|             // Define la relación uno a uno: una Bancada tiene un Ocupante.
 | |
|             entity.HasOne(b => b.Ocupante)
 | |
|                   .WithOne(o => o.Bancada)
 | |
|                   .HasForeignKey<OcupanteBanca>(o => o.BancadaId);
 | |
|         });
 | |
|         modelBuilder.Entity<OcupanteBanca>(entity =>
 | |
|         {
 | |
|             // Opcional: puede definir un índice
 | |
|             entity.HasIndex(o => o.BancadaId).IsUnique();
 | |
|         });
 | |
|         modelBuilder.Entity<LogoAgrupacionCategoria>(entity =>
 | |
|         {
 | |
|             // La combinación de las tres columnas debe ser única.
 | |
|             entity.HasIndex(l => new { l.AgrupacionPoliticaId, l.CategoriaId, l.AmbitoGeograficoId }).IsUnique();
 | |
|         });
 | |
|         modelBuilder.Entity<CandidatoOverride>(entity =>
 | |
|         {
 | |
|             // La combinación de agrupación, categoría y ámbito debe ser única
 | |
|             // para evitar tener dos nombres de candidato diferentes para la misma situación.
 | |
|             entity.HasIndex(c => new { c.AgrupacionPoliticaId, c.CategoriaId, c.AmbitoGeograficoId })
 | |
|                   .IsUnique();
 | |
|         });
 | |
|         modelBuilder.Entity<BancaPrevia>(entity =>
 | |
|         {
 | |
|             entity.Property(e => e.AgrupacionPoliticaId)
 | |
|                   .UseCollation("Modern_Spanish_CI_AS");
 | |
|         });
 | |
|     }
 | |
| } |