Skip to main content

DbContextoAmbito (DbContextScope)

Una instancia de CronoDbContexto tiene una vida corta: se toma del grupo cuando empieza una solicitud HTTP y se devuelve al grupo al terminar. Para cambiar la configuración del contexto de la solicitud durante una operación, se crea un ámbito anidado:

  1. Se crea un ámbito personalizado (DbContextoAmbito).
  2. Se realizan varias acciones dentro del ámbito.
  3. Se libera el ámbito.

Al liberar el ámbito, el estado original del contexto (el que tenía al crear el ámbito) se restaura automáticamente.

Un ámbito personalizado es útil cuando la configuración por defecto del contexto no encaja. Por ejemplo:

  • Desactivar la detección automática de cambios en operaciones largas (se vuelve más lenta cuanto más entidades hay en el rastreador).
  • Acelerar la escritura desactivando la ejecución de interceptores (resolverlos e invocarlos toma tiempo).
  • Forzar la atomicidad: guardar todos los cambios al terminar el ámbito o al consolidar explícitamente.

Uso

using (var ambito = new DbContextoAmbito(_db,
deteccionAutomaticaCambios: false,
retrasaConsolidacion: true))
{
// >>>> Trabajo pesado por lotes...

// Consolidar explícitamente (o dejar que se consolide al liberar el ámbito)
await ambito.ConsolidarAsync();
}

Además, DbContextoAmbito ofrece Consolidar() / ConsolidarAsync(ct) para guardar los cambios de forma explícita, y CargarColeccionesAsync / CargarReferenciaAsync para cargar datos relacionados.

Parámetros

Al inicializar un DbContextoAmbito, cualquier valor no nulo cambia la opción correspondiente durante la vida del ámbito. El parámetro db es el único obligatorio.

ParámetroDescripción
dbEl contexto de datos sobre el que se crea el ámbito.
deteccionAutomaticaCambiosActiva/desactiva la detección automática de cambios de EF.
cargaPerezosaActiva/desactiva la carga diferida (lazy loading).
sinSeguimientoSi es true, los resultados de consulta no se rastrean (salvo que se indique lo contrario).
retrasaConsolidacionSuprime la ejecución de SaveChanges hasta liberar el ámbito o llamar a Consolidar. Predeterminado: false.
retieneConexionAbre una conexión y la mantiene hasta cerrar el ámbito. Puede mejorar el rendimiento en ámbitos grandes. Predeterminado: false.
importanciaMinimaInterceptorImportancia mínima de interceptor: los interceptores por debajo de ese nivel no se ejecutan (ver Interceptores).
eliminarCascadaTemporizacionAjusta CascadeDeleteTiming en el rastreador de cambios de EF.
eliminarHuerfanosTemporizacionAjusta DeleteOrphansTiming en el rastreador de cambios de EF.
info

En procesos largos (importaciones, siembra, generación masiva) es habitual combinar deteccionAutomaticaCambios: false, retrasaConsolidacion: true e importanciaMinimaInterceptor para omitir interceptores Normal y ganar rendimiento.