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:
// 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 ; }
}
View Entity Configuration
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:
{
"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:
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
Context Connection Purpose Retry Enabled SateliteDBContext SateliteConnection Main application data No BitacoraCumplimientoDBContext SateliteConnection Compliance tracking Yes CajachicaDBContext CajachicaConnection Petty cash No ConsolidadoDBContext ConsolidadoConnection Consolidated financials No AnticiposDBContext AnticiposConnection Advance payments No CuboComercialDBContext CuboComercialConnection Commercial analytics No NexusDBContext NexusConnection Production planning Yes CentinelaDBContext CentinelaConnection Monitoring No DonacionesDBContext SateliteConnection Donations No MemoriaSostenibilidadDbContext SateliteConnection Sustainability reports No
Next Steps
GraphQL Overview Learn about the GraphQL implementation
Error Handling Understand error handling patterns