La biblioteca EntityFramework.Extended es una extensión diseñada para mejorar el rendimiento y las capacidades de Entity Framework (versiones 5.0 y 6.0+). Su principal ventaja radica en la ejecución de operaciones masivas de forma eficiente, generando una única sentencia SQL para tareas que, de forma nativa en EF, requerirían múltiples consultas o procesos en memoria.
Ejecución de operaciones masivas
A diferencia del enfoque estándar de Entity Framework, que requiere cargar las entidades en memoria antes de modificarlas o eliminarlas, esta extensión permite interactuar directamente con la base de datos.
Eliminación en bloque
Para eliminar registros basados en una condición sin necesidad de recuperarlos previamente:
// Uso de la extensión mediante el espacio de nombres EntityFramework.Extensions
using EntityFramework.Extensions;
// Opción 1: Eliminación directa desde el conjunto de datos
db_context.LogsEventos.Delete(log => log.FechaExpiracion < DateTime.Now);
// Opción 2: Eliminación basada en un filtro previo
db_context.LogsEventos.Where(log => log.Nivel == "Debug").Delete();
Actualización en bloque
Es posible modificar múltiples registros en una sola transacción, lo cual optimiza drásticamente el tráfico de red y la carga del servidor de base de datos:
// Actualiza el estado de todas las órdenes pendientes a 'Cancelado'
int registrosAfectados = db_context.Pedidos
.Where(p => p.Estado == "Pendiente" && p.FechaRegistro < limite)
.Update(p => new Pedido { Estado = "Cancelado", UltimaModificacion = DateTime.Now });
// Nota: Existe una sintaxis alternativa sobre DbSet que se considera obsoleta en versiones recientes
Consultas diferidas (Future Queries)
El concepto de Future Queries permite agrupar múltiples consultas independientes para que se ejecuten en un solo viaje de ida y vuelta (round-trip) al servidor de base de datos. El sistema almacena estas consultas en una cola y las despacha simultáneamente cuando se accede al primer resultado.
// Definición de consultas futuras
var totalRegistros = db_context.Activos.FutureCount();
var primerElemento = db_context.Activos.Where(a => a.EsPrioritario).FutureFirstOrDefault();
var listaCompleta = db_context.Activos.Where(a => a.Disponible).Future();
// En este punto, al acceder a 'Value' o 'ToList()', se dispara una única consulta SQL combinada
var listaFinal = listaCompleta.ToList();
int total = totalRegistros.Value;
Internamente, la librería crea objetos IFutureQuery que se registran en un IFutureContext. Cuando se solicita la enumeración de cualquiera de estos objetos, se invoca un delegado que construye un lote de comandos (batch query) y actualiza todos los resultados de forma atómica.
Auditoría de cambios en entidades
La funcionalidad de auditoría permite rastrear las operaciones de creación, modificación y eliminación de forma automática. Estos registros pueden exportarse a formatos como XML para su posterior análisis o almacenamiento en logs externos.
Para configurar el comportamiento global, se puede ajustar la configuración en el inicio de la aplicación:
var configAuditoria = AuditConfiguration.Default;
configAuditoria.IncludeRelationships = true; // Incluir relaciones entre tablas
configAuditoria.DefaultAuditable = true; // Auditar entidades por defecto
Para capturar un flujo de trabajo específico:
using (var db = new SistemaGestionContext())
{
// Iniciamos la captura de auditoría
var auditor = db.BeginAudit();
var nuevoArticulo = new Articulo { Codigo = "A101", Stock = 50 };
db.Articulos.Add(nuevoArticulo);
var itemEditar = db.Articulos.FirstOrDefault(a => a.Id == 500);
if (itemEditar != null) itemEditar.Stock -= 10;
db.SaveChanges();
// Recuperamos el log generado
var logFinal = auditor.LastLog;
string representacionXml = logFinal.ToXml();
}
Nota técnica: Es fundamental considerar que el sistema de auditoría nativo de esta extensión suele rastrear únicamente las operaciones estándar de SaveChanges(). Las operaciones de actualización masiva (Batch Update/Delete) mencionadas anteriormente podrían no ser capturadas por este mecanismo de auditoría interno.
Caché de resultados de consultas
Esta herramienta facilita el almacenamiento en caché de los resultados de consultas LINQ comunes para reducir la carga sobre la base de datos en datos que no cambian frecuentemente.
// Cachear resultados usando la política por defecto
var categorias = db.Categorias
.Where(c => c.EstaActiva)
.FromCache();
// Cachear con un tiempo de expiración específico (ej. 15 minutos)
var productosDestacados = db.Productos
.Where(p => p.EsDestacado)
.FromCache(CachePolicy.WithDurationExpiration(TimeSpan.FromMinutes(15)));