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:
- Se crea un ámbito personalizado (
DbContextoAmbito). - Se realizan varias acciones dentro del ámbito.
- 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ámetro | Descripción |
|---|---|
db | El contexto de datos sobre el que se crea el ámbito. |
deteccionAutomaticaCambios | Activa/desactiva la detección automática de cambios de EF. |
cargaPerezosa | Activa/desactiva la carga diferida (lazy loading). |
sinSeguimiento | Si es true, los resultados de consulta no se rastrean (salvo que se indique lo contrario). |
retrasaConsolidacion | Suprime la ejecución de SaveChanges hasta liberar el ámbito o llamar a Consolidar. Predeterminado: false. |
retieneConexion | Abre una conexión y la mantiene hasta cerrar el ámbito. Puede mejorar el rendimiento en ámbitos grandes. Predeterminado: false. |
importanciaMinimaInterceptor | Importancia mínima de interceptor: los interceptores por debajo de ese nivel no se ejecutan (ver Interceptores). |
eliminarCascadaTemporizacion | Ajusta CascadeDeleteTiming en el rastreador de cambios de EF. |
eliminarHuerfanosTemporizacion | Ajusta DeleteOrphansTiming en el rastreador de cambios de EF. |
En procesos largos (importaciones, siembra, generación masiva) es habitual combinar deteccionAutomaticaCambios: false, retrasaConsolidacion: true e importanciaMinimaInterceptor para omitir interceptores Normal y ganar rendimiento.