Skip to main content

Overview

Satélite API uses Entity Framework Core with multiple DbContext instances to connect to different databases. This multi-database architecture allows for:
  • Domain separation: Different business domains use separate databases
  • Scalability: Database load can be distributed
  • Legacy integration: Integration with existing database systems
  • Connection pooling: Efficient resource usage with pooled contexts

Database Context Configuration

All database contexts are configured in Program.cs:272-304 using pooled DbContext factories for optimal performance:
Program.cs:272-304
// Add services to the container
builder.Services.AddPooledDbContextFactory<SateliteDBContext>(
    options => options.UseSqlServer(
        builder.Configuration.GetConnectionString("SateliteConnection")));

builder.Services.AddPooledDbContextFactory<BitacoraCumplimientoDBContext>(
    options => options.UseSqlServer(
        builder.Configuration.GetConnectionString("SateliteConnection"),
        sqlOptions => sqlOptions.EnableRetryOnFailure(
            maxRetryCount: 5,
            maxRetryDelay: TimeSpan.FromSeconds(30),
            errorNumbersToAdd: null)));

builder.Services.AddPooledDbContextFactory<CajachicaDBContext>(
    options => options.UseSqlServer(
        builder.Configuration.GetConnectionString("CajachicaConnection")));

builder.Services.AddPooledDbContextFactory<ConsolidadoDBContext>(
    options => options.UseSqlServer(
        builder.Configuration.GetConnectionString("ConsolidadoConnection")));

builder.Services.AddPooledDbContextFactory<AnticiposDBContext>(
    options => options.UseSqlServer(
        builder.Configuration.GetConnectionString("AnticiposConnection")));

builder.Services.AddPooledDbContextFactory<CuboComercialDBContext>(
    options => options.UseSqlServer(
        builder.Configuration.GetConnectionString("CuboComercialConnection")));

builder.Services.AddPooledDbContextFactory<NexusDBContext>(
    options => options.UseSqlServer(
        builder.Configuration.GetConnectionString("NexusConnection"),
        sqlOptions => {
            sqlOptions.EnableRetryOnFailure(
                maxRetryCount: 5,
                maxRetryDelay: TimeSpan.FromSeconds(30),
                errorNumbersToAdd: null);
        }));

builder.Services.AddPooledDbContextFactory<CentinelaDBContext>(
    options => options.UseSqlServer(
        builder.Configuration.GetConnectionString("CentinelaConnection")));

builder.Services.AddPooledDbContextFactory<DonacionesDBContext>(
    options => options.UseSqlServer(
        builder.Configuration.GetConnectionString("SateliteConnection")));

builder.Services.AddPooledDbContextFactory<MemoriaSostenibilidadDbContext>(
    options => options.UseSqlServer(
        builder.Configuration.GetConnectionString("SateliteConnection")));
Connection Pooling: The AddPooledDbContextFactory method creates a pool of DbContext instances, reducing the overhead of creating new contexts for each request and improving performance.

Database Contexts

1. SateliteDBContext

Location: Services/SateliteDBContext.cs Purpose: Main application database containing core business entities Key Entities:
  • Users, Roles, and Permissions
  • Products and Materials
  • Plan Comercial
  • SKU Management
  • Gestor Documental
  • Nota de Crédito
  • Registro Consumo
  • Factores de Conversión
SateliteDBContext.cs:36-40
public class SateliteDBContext : DbContext
{
    public SateliteDBContext(DbContextOptions options) : base(options)
    {
    }
SateliteDBContext.cs:235-428
public DbSet<UsuarioDTO> Usuarios { get; set; }
public DbSet<RolesDTO> Roles { get; set; }
public DbSet<PermisoDTO> Permisos { get; set; }
public DbSet<ProductoDTO> Productos { get; set; }
public DbSet<CenizaDTO> Cenizas { get; set; }
public DbSet<ClienteDTO> Clientes { get; set; }
public DbSet<PlanComercialDTO> PlanComercialPlan { get; set; }
public DbSet<MaterialesPlanComercialDTO> MaterialesPlanComercial { get; set; }
public DbSet<SkuCabeceraDto> SkuCabecera { get; set; }
public DbSet<MenuDTO> Menu { get; set; }
public DbSet<CatalogoMaterialesHomologadosDTO> CatalogoMaterialesHomologados { get; set; }

// Gestor Documental
public DbSet<DocumentoDTO> GDDocumento { get; set; }
public DbSet<TransportistaDTO> GDTransportistas { get; set; }
public DbSet<VehiculoDTO> GDVehiculos { get; set; }

// Nota de Crédito
public DbSet<Entities.NotaCredito.NotaCredito> NotaCredito { get; set; }
public DbSet<NotaCreditoDetalle> NotaCreditoDetalle { get; set; }
public DbSet<Documento> NCDocumento { get; set; }

// Registro Consumo
public DbSet<TipoConsumoDTO> TipoConsumo { get; set; }
public DbSet<CategoriaConsumoDTO> CategoriaConsumo { get; set; }
public DbSet<RegistroConsumoCabeceraDTO> RegistroConsumoCabecera { get; set; }
public DbSet<RegistroConsumoDetalleDTO> RegistroConsumoDetalle { get; set; }

// Factores de Conversión
public DbSet<CatFactoresConversionCategoriaDTO> CatFactoresConversionCategoria { get; set; }
public DbSet<FactorConversionDTO> FactoresConversion { get; set; }

2. BitacoraCumplimientoDBContext

Location: Services/BitacoraCumplimientoDBContext.cs Purpose: Compliance tracking and auditing system Connection: Uses SateliteConnection with retry logic Key Entities:
BitacoraCumplimientoDBContext.cs:10-14
public class BitacoraCumplimientoDBContext : DbContext
{
    public BitacoraCumplimientoDBContext(
        DbContextOptions<BitacoraCumplimientoDBContext> options) : base(options)
    {
    }
BitacoraCumplimientoDBContext.cs:160-175
public DbSet<BitCuAuditoriaDTO> BitCuAuditoria { get; set; }
public DbSet<BitCuAuditoriaEquipoDTO> BitCuAuditoriaEquipo { get; set; }
public DbSet<BitCuDocumentoResponsabilidadDTO> BitCuDocumentoResponsabilidad { get; set; }
public DbSet<BitCuEmpresaDTO> BitCuEmpresa { get; set; }
public DbSet<BitCuEnteReguladorDTO> BitCuEnteRegulador { get; set; }
public DbSet<BitCuEntregableDTO> BitCuEntregable { get; set; }
public DbSet<BitCuFlujoAprobacionDTO> BitCuFlujoAprobacion { get; set; }
public DbSet<BitCuLocalidadDTO> BitCuLocalidad { get; set; }
public DbSet<BitCuProcesoDTO> BitCuProceso { get; set; }
public DbSet<BitCuRequerimientoPrimarioDTO> BitCuRequerimientoPrimario { get; set; }
public DbSet<BitCuResponsabilidadDTO> BitCuResponsabilidad { get; set; }
public DbSet<BitCuRolDTO> BitCuRol { get; set; }
public DbSet<CatalogoProductoActivoDTO> CatalogoProductoActivo { get; set; }
public DbSet<CatalogoClienteActivoDTO> CatalogoClienteActivo { get; set; }
This context has retry logic enabled (5 retries, 30 second max delay) to handle transient database failures.

3. CajachicaDBContext

Location: Services/CajachicaDBContext.cs Purpose: Petty cash management system Connection: CajachicaConnection

4. ConsolidadoDBContext

Location: Services/ConsolidadoDBContext.cs Purpose: Consolidated financial data and reporting Connection: ConsolidadoConnection

5. AnticiposDBContext

Location: Services/AnticiposDBContext.cs Purpose: Advance payment management Connection: AnticiposConnection

6. CuboComercialDBContext

Location: Services/CuboComercialDBContext.cs Purpose: Commercial data cube for analytics Connection: CuboComercialConnection

7. NexusDBContext

Location: Services/NexusDBContext.cs Purpose: Production planning and nexus data Connection: NexusConnection with retry logic
Like BitacoraCumplimientoDBContext, this context has retry logic enabled for resilience.

8. CentinelaDBContext

Location: Services/CentinelaDBContext.cs Purpose: Centinela monitoring system Connection: CentinelaConnection

9. DonacionesDBContext

Location: Services/Donaciones/DonacionesDBContext.cs Purpose: Donation management system Connection: Uses SateliteConnection Key Entities:
  • CatInstitucionDTO: Donation recipient institutions
  • CatContactoDTO: Institution contacts
  • CatTransporteDTO: Transportation catalog
  • DonacionDTO: Donation records
  • RegistroDocumentoDonacionesDTO: Document registry

10. MemoriaSostenibilidadDbContext

Location: Services/MemoriaSostenibilidad/MemoriaSostenibilidadDbContext.cs Purpose: Sustainability memory/reporting system Connection: Uses SateliteConnection Key Entities:
MemoriaSostenibilidadDbContext.cs:6-19
public class MemoriaSostenibilidadDbContext : DbContext
{
    public MemoriaSostenibilidadDbContext(
        DbContextOptions<MemoriaSostenibilidadDbContext> options)
        : base(options)
    {
    }

    public DbSet<CatMemoriaSostenibilidadProcesosDTO> 
        CatMemoriaSostenibilidadProcesos { get; set; }
    public DbSet<MemoriaSostenibilidadDTO> 
        MemoriaSostenibilidad { get; set; }
    public DbSet<MemoriaSostenibilidadArchivoDTO> 
        MemoriaSostenibilidadArchivos { get; set; }
}
MemoriaSostenibilidadDbContext.cs:22-72
// Configuración de cat_memoria_sostenibilidad_procesos
modelBuilder.Entity<CatMemoriaSostenibilidadProcesosDTO>(entity =>
{
    entity.ToTable("cat_memoria_sostenibilidad_procesos");
    entity.HasKey(e => e.Id);
    entity.Property(e => e.Nombre).IsRequired().HasMaxLength(200);
    entity.Property(e => e.Estado).IsRequired().HasDefaultValue(true);
});

// Configuración de memoria_sostenibilidad
modelBuilder.Entity<MemoriaSostenibilidadDTO>(entity =>
{
    entity.ToTable("memoria_sostenibilidad");
    entity.HasKey(e => e.Id);
    entity.Property(e => e.Sociedad).IsRequired().HasMaxLength(50);
    entity.Property(e => e.ProcesoId).IsRequired();
    entity.Property(e => e.Titulo).IsRequired().HasMaxLength(255);
    entity.Property(e => e.Descripcion).HasColumnType("NVARCHAR(MAX)");
    
    // Relación con procesos
    entity.HasOne<CatMemoriaSostenibilidadProcesosDTO>()
        .WithMany()
        .HasForeignKey(e => e.ProcesoId)
        .OnDelete(DeleteBehavior.Restrict);
    
    // Relación con archivos
    entity.HasMany(e => e.Archivos)
        .WithOne()
        .HasForeignKey(a => a.MemoriaSostenibilidadId)
        .OnDelete(DeleteBehavior.Cascade);
});

Connection String Configuration

Connection strings are defined in appsettings.json:
appsettings.json
{
  "ConnectionStrings": {
    "SateliteConnection": "Server=...;Database=Satelite;...",
    "CajachicaConnection": "Server=...;Database=Cajachica;...",
    "ConsolidadoConnection": "Server=...;Database=Consolidado;...",
    "AnticiposConnection": "Server=...;Database=Anticipos;...",
    "CuboComercialConnection": "Server=...;Database=CuboComercial;...",
    "NexusConnection": "Server=...;Database=Nexus;...",
    "CentinelaConnection": "Server=...;Database=Centinela;..."
  }
}
Shared Connections: DonacionesDBContext and MemoriaSostenibilidadDbContext both use the SateliteConnection connection string but maintain separate entity configurations.

Using DbContext Factories

Repositories use IDbContextFactory<T> for efficient context management:
Example Repository Pattern
public class DonacionRepository
{
    private readonly IDbContextFactory<DonacionesDBContext> _contextFactory;

    public DonacionRepository(
        IDbContextFactory<DonacionesDBContext> contextFactory)
    {
        _contextFactory = contextFactory;
    }

    public async Task<IEnumerable<DonacionDTO>> GetAll()
    {
        await using var context = await _contextFactory.CreateDbContextAsync();
        return await context.Donaciones.ToListAsync();
    }
}
Always use await using with DbContext instances created from factories to ensure proper disposal and return to the pool.

Retry Logic

Two contexts have automatic retry logic configured:
Retry Configuration
sqlOptions.EnableRetryOnFailure(
    maxRetryCount: 5,
    maxRetryDelay: TimeSpan.FromSeconds(30),
    errorNumbersToAdd: null
)
Contexts with retry logic:
  • BitacoraCumplimientoDBContext
  • NexusDBContext
This helps handle transient SQL Server errors automatically.

Database Context Summary

ContextConnectionPurposeRetry Enabled
SateliteDBContextSateliteConnectionMain application dataNo
BitacoraCumplimientoDBContextSateliteConnectionCompliance trackingYes
CajachicaDBContextCajachicaConnectionPetty cashNo
ConsolidadoDBContextConsolidadoConnectionConsolidated financialsNo
AnticiposDBContextAnticiposConnectionAdvance paymentsNo
CuboComercialDBContextCuboComercialConnectionCommercial analyticsNo
NexusDBContextNexusConnectionProduction planningYes
CentinelaDBContextCentinelaConnectionMonitoringNo
DonacionesDBContextSateliteConnectionDonationsNo
MemoriaSostenibilidadDbContextSateliteConnectionSustainability reportsNo

Next Steps

GraphQL Overview

Learn about the GraphQL implementation

Error Handling

Understand error handling patterns

Build docs developers (and LLMs) love