Domine Entity Framework: 50 preguntas clave de entrevista y respuestas (2026)
Prepararse para una entrevista de Entity Framework significa anticipar las preguntas que revelan la capacidad real. Las Preguntas de Entrevista de Entity Framework revelan pensamiento, conciencia de rendimiento y cómo los candidatos traducen conceptos a la práctica.
Dominar Entity Framework abre roles en desarrollo moderno, desde plataformas basadas en datos a servicios en la nube. La exposición práctica desarrolla capacidad analítica, fortalece profundidad técnica y apoya equipos. Los líderes de contratación valoran resolución de problemas práctica, diseño escalable, mentoría de juniors y rutas de crecimiento para graduados.
Leer más…👉 Descarga Gratuita PDF: Preguntas y Respuestas de Entrevista de Entity Framework
1) ¿Qué es Entity Framework y por qué se usa?
Entity Framework (EF) es el framework ORM (Mapeo Objeto-Relacional) de Microsoft para .NET que simplifica la interacción con bases de datos permitiendo a desarrolladores trabajar con datos como objetos .NET fuertemente tipados en lugar de SQL crudo. Esta abstracción permite a desarrolladores realizar operaciones CRUD (Crear, Leer, Actualizar, Eliminar) usando constructos familiares de C#, y el framework maneja la traducción de estas operaciones a consultas SQL optimizadas bajo el capó. EF reduce código boilerplate de acceso a datos, mejora la mantenibilidad y ayuda a imponer seguridad de tipos en tiempo de compilación.
Por ejemplo, en lugar de escribir SQL, puede usar:
var customers = context.Customers.Where(c => c.IsActive).ToList();
EF traducirá esta consulta LINQ a SQL, la ejecutará contra la base de datos y devolverá los resultados como objetos.
2) Explique la diferencia entre los enfoques Code First, Database First y Model First.
Entity Framework soporta tres enfoques principales de desarrollo:
| Enfoque | Cuándo Usar | Qué Sucede |
|---|---|---|
| Code First | Proyectos nuevos o diseño guiado por dominio | Define clases de entidad. EF genera el esquema de BD desde código. |
| Database First | Base de datos existente | EF genera clases de entidad y contexto desde un esquema existente. |
| Model First | Cuando prefiere diseño visual | Diseña el modelo en un diseñador visual (Entity Designer), y EF genera tanto clases como BD. |
Cada enfoque sirve diferentes escenarios: Code First es popular en desarrollo ágil, Database First se prefiere con bases de datos legacy, y Model First conviene casos donde el modelado visual es importante.
3) ¿Qué es DbContext y qué papel juega en EF?
DbContext es la clase principal que gestiona la sesión con la base de datos, rastrea cambios de entidades y coordina el guardado de datos de vuelta a la base de datos. Representa un puente entre su aplicación C# y la base de datos. A través de DbContext, define propiedades DbSet<TEntity>, que representan colecciones de entidades y se mapean a tablas en la base de datos.
Ejemplo:
public class AppDbContext : DbContext { public DbSet<Product> Products { get; set; } } Aquí, Products actúa como una colección para realizar operaciones CRUD. EF usa este contexto para rastrear estados de objetos y generar comandos SQL en SaveChanges().
4) ¿Qué son las migraciones en Entity Framework y cómo se usan?
Migraciones son un mecanismo para rastrear y aplicar cambios de esquema a la base de datos con el tiempo. A medida que su modelo evoluciona, las migraciones ayudan a mantener la base de datos sincronizada sin modificar manualmente scripts SQL. Con Code First, usa comandos como:
Add-Migration InitialCreate Update-Database
Esto genera clases de migración que definen cambios de esquema y los aplica a la base de datos. Las migraciones permiten control de versiones para el esquema de BD y facilitan desarrollo colaborativo.
5) Describa Lazy Loading, Eager Loading y Explicit Loading.
Cargar datos relacionados eficientemente es crítico en EF. Aquí hay una comparación:
| Estrategia | Cuándo se Ejecuta | Uso Típico |
|---|---|---|
| Lazy Loading | Datos relacionados cargados al primer acceso | Use cuando los datos relacionados no siempre sean necesarios. |
| Eager Loading | Datos relacionados cargados por adelantado vía .Include() | Use cuando sepa que necesita datos relacionados. |
| Explicit Loading | Cargados manualmente después de la consulta | Da control sobre exactamente cuándo se cargan datos relacionados. |
Por ejemplo:
var orders = context.Orders.Include(o => o.Customer).ToList(); // Eager
El lazy loading ayuda a reducir consultas iniciales, pero puede causar problemas de consultas N+1 si no se usa cuidadosamente.
6) ¿Qué es el seguimiento de cambios en Entity Framework?
El seguimiento de cambios es el mecanismo interno de EF para monitorizar cambios de estado de entidades después de ejecutar una consulta. Cuando una entidad es recuperada por DbContext, es rastreada. Cualquier modificación a sus propiedades se anota, y cuando se llama a SaveChanges(), EF genera las sentencias SQL INSERT, UPDATE o DELETE apropiadas. Para escenarios de solo lectura donde el rastreo es innecesario, AsNoTracking() mejora el rendimiento deshabilitando el seguimiento de cambios.
7) ¿Cómo maneja Entity Framework los conflictos de concurrencia?
El control de concurrencia asegura que múltiples usuarios actualizando los mismos datos no sobrescriban involuntariamente los cambios de otros. EF usa concurrencia optimista por defecto. Un enfoque común involucra agregar un token de concurrencia (como un RowVersion timestamp). EF verifica este token durante SaveChanges(), y si difiere de la versión de la base de datos, se lanza una DbUpdateConcurrencyException, indicando un conflicto. Los desarrolladores pueden manejar esta excepción para reintentar o resolver diferencias de datos.
8) ¿Qué son las propiedades de navegación en EF?
Las propiedades de navegación definen relaciones entre entidades. Permiten a EF navegar asociaciones (ej. uno-a-muchos) uniones manuales:
public class Order { public int Id { get; set; } public Customer Customer { get; set; } } Aquí, Customer es una propiedad de navegación vinculando Order a su Customer relacionado. EF usa estas propiedades para construir relaciones y uniones automáticamente durante consultas. Las propiedades de navegación funcionan junto a claves foráneas para modelar relaciones.
9) ¿Cuál es el propósito de AsNoTracking()?
AsNoTracking() deshabilita el seguimiento de cambios para una consulta, lo cual es beneficioso para operaciones de solo lectura donde no pretende actualizar las entidades recuperadas. Esto mejora el rendimiento reduciendo uso de memoria y sobrecarga de rastreo. Es especialmente útil al recuperar grandes conjuntos de datos sin modificarlos.
10) ¿Qué son las consultas compiladas y cuándo debería usarlas?
Las consultas compiladas son una técnica de optimización de rendimiento. Cuando una consulta LINQ se ejecuta, EF típicamente la traduce a SQL cada vez. Con consultas compiladas, esta traducción se hace una vez, y el delegado resultante se reutiliza — reduciendo sobrecarga para consultas ejecutadas frecuentemente o complejas. Úselas en escenarios de alto tráfico donde la misma consulta se ejecuta repetidamente con diferentes parámetros.
11) ¿Qué son los estados de entidad en Entity Framework, y cómo afectan a SaveChanges()?
Entity Framework rastrea el estado de cada entidad para determinar qué operación de base de datos realizar durante SaveChanges(). Los principales estados de entidad son:
| Estado | Descripción | Operación Desencadenada |
|---|---|---|
| Added | Nueva entidad para insertar | INSERT |
| Modified | Entidad existente actualizada | UPDATE |
| Deleted | Entidad marcada para eliminación | DELETE |
| Unchanged | Sin cambios detectados | Ninguna |
| Detached | No rastreada por contexto | Ninguna |
Cuando llama a SaveChanges(), EF inspecciona los estados de entidad y ejecuta comandos SQL correspondientes. Por ejemplo, una nueva entidad añadida a un DbSet será marcada Added, resultando en una consulta INSERT.
Ejemplo:
context.Entry(product).State = EntityState.Modified; context.SaveChanges();
Esto actualiza explícitamente el registro de base de datos para la entidad.
Entender los estados asegura mejor control sobre sincronización de datos y rendimiento.
12) ¿Cuáles son las ventajas y desventajas de usar Entity Framework?
Entity Framework proporciona fuertes beneficios pero también algunos compromisos, dependiendo de su caso de uso.
| Ventajas | Desventajas |
|---|---|
| Simplifica acceso a datos mediante LINQ y modelos de objetos. | Sobrecarga de rendimiento comparado con ADO.NET crudo. |
| Reduce código SQL boilerplate. | Consultas complejas pueden generar SQL ineficiente. |
| Soporta múltiples proveedores de base de datos. | Más difícil depurar sentencias SQL generadas. |
| Fuertemente tipado, mejorando seguridad en tiempo de compilación. | Conflictos de migración en equipos grandes posibles. |
| Permite prototipado rápido con Code First. | Menos control sobre consultas afinadas. |
Para sistemas a gran escala requiriendo máximo rendimiento, los desarrolladores pueden seguir mezclando SQL crudo con EF para optimización.
13) ¿Cómo maneja Entity Framework las relaciones (uno-a-uno, uno-a-muchos, muchos-a-muchos)?
Entity Framework gestiona relaciones vía propiedades de navegación y asociaciones de clave foránea.
Los tipos de relaciones son:
| Tipo de Relación | Descripción | Ejemplo |
|---|---|---|
| Uno-a-Uno | Cada instancia de entidad tiene una entidad relacionada. | User ↔ UserProfile |
| Uno-a-Muchos | Una entidad se relaciona con múltiples otras. | Customer → Orders |
| Muchos-a-Muchos | Múltiples entidades se relacionan entre sí. | Student ↔ Course |
Ejemplo de relación Uno-a-Muchos:
public class Customer { public int CustomerId { get; set; } public ICollection<Order> Orders { get; set; } } EF genera automáticamente claves foráneas y maneja reglas de cascada en eliminación dependiendo de configuración.
También puede usar Fluent API para mapeo de relaciones más explícito.
14) ¿Cuál es la diferencia entre LINQ to Entities y LINQ to SQL?
| Característica | LINQ to Entities | LINQ to SQL |
|---|---|---|
| Bases de Datos Soportadas | Múltiples (SQL Server, Oracle, MySQL, etc.) | Solo SQL Server |
| Framework Subyacente | Entity Framework | ADO.NET |
| Modelo Conceptual | Modelo de Entidad | Tablas de BD solo |
| Mapeo | Mapeo complejo (herencia, asociaciones) | Mapeo directo a tablas |
| Soporte Futuro | Activamente soportado | Obsoleto |
LINQ to Entities es parte de Entity Framework y más versátil, mientras LINQ to SQL está limitado a SQL Server y casos de uso más simples.
Por tanto, LINQ to Entities se recomienda para desarrollo a nivel empresarial.
15) ¿Cuál es la diferencia entre ObjectContext y DbContext?
| Característica | ObjectContext | DbContext |
|---|---|---|
| Framework | Versiones anteriores de EF | API simplificada en EF 4.1+ |
| Complejidad | Más verboso | Ligero y fácil |
| Rendimiento | Ligeramente más rápido pero más difícil de usar | Simplificado con sobrecarga mínima |
| Seguimiento de Cambios | Configuración manual necesaria | Rastreo automático |
| Uso Preferido | Sistemas legacy | Proyectos EF / EF Core modernos |
DbContext envuelve internamente ObjectContext pero proporciona una API más limpia e intuitiva. La mayoría de aplicaciones .NET actuales deberían usar DbContext.
16) Explique el ciclo de vida de una entidad en Entity Framework.
El ciclo de vida de una entidad describe sus transiciones de estado desde la creación hasta la persistencia:
- Creación – La entidad se instancia en memoria (estado: Detached).
- Adjunción – Añadida al contexto vía
DbSet.Add()(estado: Added). - Modificación – Cambios detectados automáticamente (estado: Modified).
- Persistencia –
SaveChanges()llamado → comandos SQL ejecutados. - Eliminación – Entidad marcada como Deleted y removida de la base de datos.
Entender este ciclo ayuda a depurar problemas de datos y optimizar gestión de contexto EF.
17) ¿Cuál es el uso de Fluent API en Entity Framework?
El Fluent API proporciona una forma programática de configurar relaciones de modelo, restricciones y mapeos, a menudo usado en el método OnModelCreating() de su DbContext.
Da control fino sobre configuraciones que las anotaciones de datos no pueden expresar.
Ejemplo:
modelBuilder.Entity<Customer>() .HasMany(c => c.Orders) .WithOne(o => o.Customer) .HasForeignKey(o => o.CustomerId);
Fluent API es particularmente poderoso para configurar claves compuestas, relaciones muchos-a-muchos y reglas de cascada.
18) ¿Qué son las Anotaciones de Datos en Entity Framework?
Las Anotaciones de Datos son atributos aplicados directamente a clases de modelo o propiedades para definir comportamiento de esquema. Son más simples que Fluent API pero menos flexibles.
Ejemplo:
public class Product { [Key] public int ProductId { get; set; } [Required] [StringLength(50)] public string Name { get; set; } } Las anotaciones definen claves, longitudes de cadena, campos requeridos y relaciones. Para casos avanzados, los desarrolladores suelen combinar Anotaciones de Datos y Fluent API.
19) ¿Cuál es la diferencia entre entidades rastreadas y no rastreadas en EF Core?
| Tipo | Descripción | Caso de Uso |
|---|---|---|
| Entidades Rastreadas | Monitoreadas por DbContext para cambios. Comportamiento por defecto para actualizaciones. | |
| Entidades No Rastreadas | No monitoreadas; recuperadas con .AsNoTracking(). Ideales para operaciones de solo lectura. |
Las entidades rastreadas consumen más memoria pero permiten a EF detectar cambios automáticamente.
Las entidades no rastreadas mejoran el rendimiento en escenarios de alta lectura, baja actualización.
20) ¿Cómo puede ejecutar consultas SQL crudas en Entity Framework?
Entity Framework permite ejecutar SQL crudo para consultas personalizadas o críticas de rendimiento.
var result = context.Products .FromSqlRaw("SELECT * FROM Products WHERE Price > 100") .ToList(); Para comandos no de consulta:
context.Database.ExecuteSqlRaw("DELETE FROM Products WHERE Discontinued = 1"); Use esta característica con cuidado para evitar inyección SQL y mantener flexibilidad agnóstica de base de datos.
21) ¿Cuál es la diferencia entre Entity Framework y Entity Framework Core?
Entity Framework (EF) y Entity Framework Core (EF Core) difieren en arquitectura, capacidades y soporte multiplataforma.
| Característica | Entity Framework 6 (EF6) | Entity Framework Core |
|---|---|---|
| Plataforma | .NET Framework solo | Multiplataforma (.NET 5/6/7) |
| Arquitectura | Basada en ObjectContext | Ligera y modular |
| Rendimiento | Más lento en algunas consultas | Generación de consultas optimizada |
| Soporte LINQ | Maduros pero limitado | Traducción mejorada y async |
| Proveedores de BD | SQL Server, Oracle | Múltiples (MySQL, PostgreSQL, SQLite, etc.) |
| Características | Maduros (ej. lazy loading) | Modernos (ej. shadow properties, filtros globales) |
EF Core es la versión moderna, activamente desarrollada y la opción recomendada para nuevos proyectos .NET debido a su flexibilidad y rendimiento.
22) ¿Cómo funcionan las transacciones en Entity Framework?
Las transacciones en Entity Framework aseguran integridad de datos cuando múltiples operaciones deben tener éxito o fallar juntas. Por defecto, EF envuelve SaveChanges() dentro de una transacción. Para control manual:
using (var transaction = context.Database.BeginTransaction()) { try { context.Customers.Add(new Customer()); context.SaveChanges(); context.Orders.Add(new Order()); context.SaveChanges(); transaction.Commit(); } catch { transaction.Rollback(); } } Esto asegura atomicidad — si cualquier comando falla, todos los cambios se revierten.
EF también se integra con System.Transactions para soporte de transacciones distribuidas.
23) Explique las estrategias de herencia TPH, TPT y TPC en Entity Framework.
Entity Framework soporta tres estrategias principales de mapeo de herencia para modelar jerarquías de clases.
| Estrategia | Descripción | Ejemplo | Ventajas | Desventajas |
|---|---|---|---|---|
| TPH (Tabla Por Jerarquía) | Todas las clases comparten una tabla; una columna discriminadora identifica el tipo. Común en EF Core. | Simple, consultas rápidas. | Tabla puede volverse grande y dispersa. | |
| TPT (Tabla Por Tipo) | Cada subclase tiene su propia tabla. Cada clase derivada se mapea separadamente. | Esquema normalizado. | Uniones más lentas en jerarquías grandes. | |
| TPC (Tabla Por Clase Concreta) | Cada clase tiene su propia tabla con columnas duplicadas. Cada entidad mapeada separadamente. | Lecturas de alto rendimiento. | Redundancia de datos. |
La mayoría de desarrolladores prefieren TPH por su simplicidad, a menos que necesidades de normalización o rendimiento dicten lo contrario.
24) ¿Cómo maneja el ajuste de rendimiento en Entity Framework?
Para optimizar el rendimiento de Entity Framework:
- Use
AsNoTracking()para consultas de solo lectura. - Carga ansiosa (Eager load) solo entidades relacionadas necesarias con
.Include(). - Evite consultas N+1 usando proyecciones o
Select(). - Use consultas compiladas para operaciones ejecutadas frecuentemente.
- Inserciones/actualizaciones en lote con
AddRange()ySaveChanges(). - Deshabilite AutoDetectChanges para operaciones masivas:
context.Configuration.AutoDetectChangesEnabled = false; - Use caché y paginación para grandes conjuntos de datos.
Una implementación EF bien ajustada puede acercarse al rendimiento de ADO.NET manteniendo productividad del desarrollador.
25) ¿Qué es una propiedad shadow en Entity Framework Core?
Una propiedad shadow existe en el modelo EF pero no en la clase de entidad. Es mantenida por EF en el rastreador de cambios y almacenada en la base de datos.
Ejemplo:
modelBuilder.Entity<Order>() .Property<DateTime>("LastUpdated"); Esto permite a EF almacenar metadatos extra (ej. timestamps, info de auditoría) sin modificar la clase de entidad.
Puede acceder a propiedades shadow vía:
var value = context.Entry(order).Property("LastUpdated").CurrentValue; Las propiedades shadow son ideales para escenarios de logging o auditoría.
26) ¿Qué son los convertidores de valor en EF Core?
Los convertidores de valor en EF Core permiten transformación de valores de propiedad al leer o escribir en la base de datos.
Por ejemplo, para almacenar un enum como cadena:
modelBuilder.Entity<Employee>() .Property(e => e.Status) .HasConversion( v => v.ToString(), v => (EmployeeStatus)Enum.Parse(typeof(EmployeeStatus), v));
Esto mejora flexibilidad para tipos de datos personalizados como enum, bool o DateTimeOffset.
Los convertidores de valor también se usan para cifrado, compresión o enmascaramiento de datos sensibles.
27) ¿Qué son los filtros de consulta globales y cómo funcionan?
Los filtros de consulta globales permiten aplicar condiciones automáticamente a todas las consultas para una entidad.
Esto es especialmente útil para borrados suaves (soft deletes) o multi-tenancy.
Ejemplo:
modelBuilder.Entity<Employee>() .HasQueryFilter(e => !e.IsDeleted);
Cada consulta ejecutada contra Employee excluye automáticamente registros borrados suavemente, a menos que se anule explícitamente.
Los filtros globales mejoran mantenibilidad y seguridad de datos.
28) ¿Cómo puede probar código de Entity Framework usando pruebas unitarias?
Para probar lógica EF sin golpear una base de datos real, use bases de datos en memoria o mocking:
- Opción 1: Proveedor InMemory
var options = new DbContextOptionsBuilder<AppDbContext>() .UseInMemoryDatabase("TestDb") .Options; - Opción 2: Mock DbContext
MockDbSetusando librerías como Moq para pruebas aisladas.
Las pruebas unitarias deben validar:
- Corrección de consultas (vía LINQ)
- Consistencia de datos después de
SaveChanges() - Lógica de repositorio
Probar con EF Core InMemory asegura velocidad y evita dependencias de SQL Server.
29) Explique los patrones Repository y Unit of Work en EF.
Estos dos patrones arquitectónicos ayudan a abstraer acceso a datos y mantener consistencia transaccional.
| Patrón | Propósito | Ejemplo de Implementación |
|---|---|---|
| Repository | Encapsula operaciones CRUD para cada entidad. | IRepository<T> interfaz con Add(), GetAll(), etc. |
| Unit of Work | Coordina múltiples repositorios dentro de una transacción. | SaveChanges() actúa como límite de commit. |
Ejemplo:
public class UnitOfWork : IUnitOfWork { private readonly AppDbContext _context; public void Commit() => _context.SaveChanges(); } Estos patrones mejoran testabilidad, reutilización de código y separación de preocupaciones en aplicaciones empresariales grandes.
30) ¿Cuál es la diferencia entre carga ansiosa (eager loading) y carga por proyección (projection loading)?
| Aspecto | Carga Ansiosa | Carga por Proyección |
|---|---|---|
| Propósito | Carga datos relacionados por adelantado | Carga solo campos o propiedades específicas |
| Método | .Include() | .Select() |
| Ejemplo | context.Orders.Include(o => o.Customer) | context.Orders.Select(o => new { o.Id, o.Customer.Name }) |
| Rendimiento | Obtiene objetos completos | Obtiene datos mínimos |
| Caso de Uso | Cuando entidades relacionadas necesarias para procesamiento | Cuando necesita datos específicos ligeros |
La carga por proyección es una optimización de rendimiento que reduce sobrecarga de memoria seleccionando solo columnas necesarias.
31) ¿Qué son los interceptores en Entity Framework Core?
Los interceptores en EF Core permiten a desarrolladores interceptar y modificar operaciones de base de datos como ejecución de consultas, creación de comandos y apertura de conexiones.
Actúan como componentes middleware entre EF y el proveedor de base de datos.
Ejemplo: Logging de todos los comandos SQL ejecutados.
public class CommandInterceptor : DbCommandInterceptor { public override void ReaderExecuting( DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result) { Console.WriteLine($"Ejecutando SQL: {command.CommandText}"); base.ReaderExecuting(command, eventData, result); } } Lo registra en el DbContextOptionsBuilder:
optionsBuilder.AddInterceptors(new CommandInterceptor());
Beneficios:
- Logging mejorado
- Seguridad (validación de consultas)
- Auditoría y seguimiento de rendimiento
32) ¿Cómo maneja EF Core operaciones asíncronas?
Entity Framework Core soporta completamente la programación asíncrona mediante métodos como SaveChangesAsync(), ToListAsync() y FirstOrDefaultAsync().
La ejecución asíncrona ayuda a mejorar la escalabilidad en aplicaciones web liberando hilos mientras se esperan operaciones de base de datos I/O-bound.
Ejemplo:
var customers = await context.Customers .Where(c => c.IsActive) .ToListAsync();
Las operaciones async son particularmente efectivas en APIs ASP.NET Core y microservicios de alto rendimiento, reduciendo llamadas bloqueantes y mejorando tiempos de respuesta.
33) ¿Qué es la resiliencia de conexión en Entity Framework Core?
La resiliencia de conexión ayuda a su aplicación a recuperarse automáticamente de fallos transitorios de base de datos, como interrupciones de red o timeouts de SQL.
Se puede configurar así:
optionsBuilder.UseSqlServer( connectionString, options => options.EnableRetryOnFailure(5, TimeSpan.FromSeconds(10), null) );
Aquí, EF reintentará operaciones fallidas hasta 5 veces con retrasos.
Esto es particularmente útil en entornos alojados en la nube como Azure SQL donde los fallos transitorios son comunes.
34) ¿Qué son los tipos de entidad propios (owned entity types) en EF Core?
Las entidades propias permiten modelar objetos de valor que dependen completamente del ciclo de vida de otra entidad.
Comparten la misma tabla que su propietario y no pueden existir independientemente.
Ejemplo:
public class Address { public string Street { get; set; } public string City { get; set; } } public class Customer { public int Id { get; set; } public Address Address { get; set; } } Configuración:
modelBuilder.Entity<Customer>().OwnsOne(c => c.Address);
Caso de Uso:
Modelar conceptos como Dirección, Dinero o Medición que no tienen identidad propia.
35) ¿Cómo implementar borrados suaves (soft deletes) en Entity Framework Core?
Los borrados suaves marcan registros como eliminados en lugar de removerlos físicamente.
Se implementan usando una bandera booleana y filtros de consulta globales.
modelBuilder.Entity<Employee>() .HasQueryFilter(e => !e.IsDeleted);
En la operación de eliminación:
employee.IsDeleted = true; context.Update(employee); context.SaveChanges();
Ventajas:
- Preservación de datos históricos
- Recuperación más fácil
Desventajas:
- Tablas de base de datos más grandes
- Requiere lógica de filtrado cuidadosa
36) ¿Qué es el modelo compilado en EF Core y por qué se usa?
En EF Core 6+, los modelos compilados permiten precompilar los metadatos del modelo EF en un ensamblado .NET, reduciendo tiempo de inicio y sobrecarga en tiempo de ejecución.
Pasos:
- Ejecute el comando:
dotnet ef dbcontext optimize - EF genera un archivo de modelo precompilado que la aplicación carga más rápido en tiempo de ejecución.
Beneficio: Reduce latencia de inicialización en 30-40%, especialmente en aplicaciones grandes con muchas entidades.
Caso de Uso: Microservicios de alto rendimiento y entornos serverless.
37) ¿Cómo implementar caché en Entity Framework?
El caché ayuda a reducir consultas repetitivas a base de datos. Hay dos niveles principales:
| Tipo | Descripción | Ejemplo |
|---|---|---|
| Caché de primer nivel | Integrado, por instancia DbContext | Gestionado automáticamente |
| Caché de segundo nivel | Caché externo compartido entre contextos | Use librerías como EFCoreSecondLevelCacheInterceptor |
Ejemplo para caché de segundo nivel:
services.AddEFSecondLevelCache(options => { options.UseMemoryCacheProvider().DisableLogging(false); }); Esto mejora significativamente el rendimiento en aplicaciones con mucha lectura evitando accesos redundantes a BD.
38) ¿Cómo gestiona EF Core tokens de concurrencia y timestamps?
Los tokens de concurrencia previenen actualizaciones conflictivas en entornos multi-usuario.
Puede marcar una propiedad como token de concurrencia usando el atributo [ConcurrencyCheck] o [Timestamp].
Ejemplo:
public class Product { public int Id { get; set; } [Timestamp] public byte[] RowVersion { get; set; } } Cuando ocurre una actualización, EF incluye esta columna en la cláusula WHERE.
Si el valor no coincide, se lanza una DbUpdateConcurrencyException — asegurando control de concurrencia optimista.
39) ¿Cómo implementar auditoría (seguimiento de creado, modificado, eliminado) en EF Core?
La auditoría rastrea metadatos como quién creó, modificó o eliminó registros.
Puede sobrescribir SaveChanges():
public override int SaveChanges() { var entries = ChangeTracker.Entries() .Where(e => e.Entity is IAuditable && (e.State == EntityState.Added || e.State == EntityState.Modified)); foreach (var entry in entries) { var auditable = (IAuditable)entry.Entity; auditable.LastModified = DateTime.UtcNow; } return base.SaveChanges(); } Interfaz:
public interface IAuditable { DateTime Created { get; set; } DateTime LastModified { get; set; } } Este método centraliza lógica de auditoría, asegurando gobernanza de datos consistente.
40) ¿Cuáles son las mejores prácticas para usar Entity Framework en aplicaciones empresariales?
| Categoría | Mejor Práctica | Beneficio |
|---|---|---|
| Rendimiento | Use AsNoTracking() y proyecciones para consultas de solo lectura. | Reduce sobrecarga. |
| Diseño | Implemente patrones Repository y Unit of Work. | Mejora mantenibilidad. |
| Seguridad | Use consultas parametrizadas para evitar inyección SQL. | Protección de datos. |
| Escalabilidad | Use pooling de conexiones y métodos async. | Maneja alta carga. |
| Migraciones | Use migraciones automatizadas con control de versiones. | Simplifica gestión de esquema. |
| Configuración | Externalice cadenas de conexión y secretos. | Mejor aislamiento de entornos. |
| Pruebas | Use proveedor InMemory para pruebas unitarias. | Ejecución de pruebas más rápida. |
| Logging | Habilite logging de EF para insights de rendimiento. | Depuración más fácil. |
Estas prácticas aseguran aplicaciones robustas, escalables y mantenibles construidas sobre Entity Framework.
41) ¿Cómo optimizar consultas LINQ para mejor traducción SQL en Entity Framework?
Entity Framework convierte automáticamente consultas LINQ a SQL, pero patrones ineficientes pueden producir SQL lento o redundante. Optimizar LINQ asegura que el ORM genere consultas de base de datos performantes.
Técnicas de Optimización:
Use Proyecciones:
- Seleccione solo las columnas requeridas en lugar de entidades completas.
var customers = context.Customers .Select(c => new { c.Id, c.Name }) .ToList(); Evite Evaluación del Lado del Cliente:Asegure siempre que el filtrado ocurra en SQL, no en memoria. EF Core advierte cuando la evaluación es del lado del cliente. Use
AsNoTracking() para datos de solo lectura. var orders = context.Orders.AsNoTracking().ToList();Aproveche Consultas Compiladas para operaciones LINQ repetidas. Evite llamadas
.Include() innecesarias — solo incluya datos relacionados cuando sean necesarios. Ejemplo:
Ineficiente:
context.Customers.ToList().Where(c => c.IsActive);
Eficiente:
context.Customers.Where(c => c.IsActive).ToList();
42) ¿Cuáles son las diferentes formas de sembrar datos iniciales en EF Core?
El sembrado de datos asegura que la base de datos tenga datos por defecto o de referencia al crearse.
Enfoque 1: Usando ModelBuilder
modelBuilder.Entity<Role>().HasData( new Role { Id = 1, Name = "Admin" }, new Role { Id = 2, Name = "User" } ); Esto inserta datos automáticamente durante Update-Database.
Enfoque 2: Método de Sembrado Personalizado
Ejecute código manualmente al inicio:
context.Database.Migrate(); if (!context.Users.Any()) { context.Users.Add(new User { Name = "Admin" }); context.SaveChanges(); } Enfoque 3: Scripts SQL
Use SQL crudo en migraciones:
migrationBuilder.Sql("INSERT INTO Roles (Name) VALUES ('Admin')"); Recomendación:
Use HasData() para datos de referencia estáticos y sembrado programático para datos de inicio dinámicos.
43) ¿Cómo gestiona EF Core los proveedores de base de datos internamente?
EF Core es agnóstico de proveedor, lo que significa que puede apuntar a múltiples motores de base de datos vía paquetes de proveedor de base de datos separados.
Proveedores Comunes:
| Proveedor | Paquete NuGet | Base de Datos |
|---|---|---|
| SQL Server | Microsoft.EntityFrameworkCore.SqlServer | MSSQL |
| SQLite | Microsoft.EntityFrameworkCore.Sqlite | Móvil/Escritorio |
| PostgreSQL | Npgsql.EntityFrameworkCore.PostgreSQL | PostgreSQL |
| MySQL | Pomelo.EntityFrameworkCore.MySql | MySQL |
| Cosmos DB | Microsoft.EntityFrameworkCore.Cosmos | NoSQL |
Internamente, EF Core usa capas de abstracción para:
- Traducción de consultas
- Generación de comandos SQL
- Mapeo de tipos de datos
Cada proveedor implementa sus propias clases heredando de las abstracciones base de EF Core (ej. RelationalDatabaseProvider, QuerySqlGenerator).
44) ¿Qué es una "consulta dividida" (split query) y cuándo debería usarla?
Las consultas divididas evitan que EF realice uniones grandes y complejas ejecutando múltiples consultas SQL en lugar de una.
Ejemplo:
var customers = context.Customers .Include(c => c.Orders) .AsSplitQuery() .ToList();
Esto ejecuta:
- Consulta 1 → Obtener Clientes
- Consulta 2 → Obtener Órdenes relacionadas con esos clientes
Beneficios:
- Evita productos cartesianos grandes.
- Mejora rendimiento con grandes conjuntos de datos relacionados.
Inconveniente:
Múltiples viajes de ida y vuelta a la base de datos.
Use consultas divididas cuando la carga ansiosa de grandes datos relacionados pueda causar problemas de memoria.
45) ¿Cómo monitorizar comandos SQL generados por EF eficazmente?
Monitorizar SQL ayuda a depurar consultas lentas y optimizar comportamiento del ORM.
Métodos para Loguear SQL:
- Logging en Consola
optionsBuilder .UseSqlServer(conn) .LogTo(Console.WriteLine, LogLevel.Information);Integración ILoggerFactory
var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole()); optionsBuilder.UseLoggerFactory(loggerFactory);Interceptores Implemente
DbCommandInterceptor para capturar comandos y tiempos. Herramientas de Perfilado Use herramientas como: - MiniProfiler
- SQL Server Profiler
- EFCorePowerTools
El logging debería habilitarse selectivamente en producción para evitar sobrecarga de rendimiento.
46) ¿Cuál es la diferencia entre ChangeTracker.DetectChanges() y AutoDetectChangesEnabled?
| Característica | DetectChanges() | AutoDetectChangesEnabled |
|---|---|---|
| Tipo | Método | Propiedad |
| Propósito | Fuerza a EF a escanear entidades rastreadas y detectar cambios | Habilita/deshabilita detección automática de cambios |
| Uso | Llamar explícitamente para optimización de rendimiento | Deshabilitar para actualizaciones masivas |
Ejemplo:
context.ChangeTracker.AutoDetectChangesEnabled = false; foreach (var item in list) { context.Add(item); } context.SaveChanges(); Deshabilitar la detección automática en bucles mejora el rendimiento hasta un 40% en operaciones masivas.
47) ¿Cómo usar tablas temporales con EF Core?
Las tablas temporales (introducidas en SQL Server 2016) permiten rastrear datos históricos automáticamente.
Pasos:
- Habilite soporte temporal en migración:
builder.Entity<Employee>() .ToTable("Employees", b => b.IsTemporal()); Consultar datos históricos: var history = context.Employees .TemporalAsOf(DateTime.UtcNow.AddDays(-7)) .ToList();
Ventajas:
- Seguimiento de historial de datos integrado
- Auditoría y cumplimiento
- No se requieren triggers manuales
EF Core 6+ soporta consultas temporales completas.
48) ¿Cómo soporta EF Core consultas compiladas y modelos pregenerados juntos?
Las consultas compiladas y los modelos compilados son dos características de rendimiento que se complementan.
| Característica | Propósito |
|---|---|
| Consultas Compiladas | Cachean resultados de traducción de consultas |
| Modelos Compilados | Precompilan metadatos del modelo |
Ejemplo de Consulta Compilada:
static readonly Func<AppDbContext, int, Customer> _getCustomerById = EF.CompileQuery((AppDbContext ctx, int id) => ctx.Customers.FirstOrDefault(c => c.Id == id));
Uso:
var customer = _getCustomerById(context, 5);
Juntos: Los modelos compilados reducen el coste de inicio, mientras las consultas compiladas reducen la sobrecarga de consultas en tiempo de ejecución — ideal para consultas de alta frecuencia.
49) ¿Cuáles son los errores comunes al usar EF en arquitectura de microservicios?
Errores Comunes:
- DbContext Compartido Entre Servicios
→ Viola aislamiento de microservicio.
→ Cada microservicio debería tener su propio DbContext y esquema. - Comunicación Charlatana (Consultas N+1)
→ Minimice consultas EF por llamada API. - Carga Ansiosa Excesiva
→ Cargue solo lo requerido vía DTOs. - Migraciones Centralizadas
→ Cada servicio debería gestionar sus propias migraciones independientemente. - Falta de Límites Transaccionales
→ Use transacciones distribuidas (patrón Outbox) si se requiere consistencia entre servicios. - Acoplamiento Fuerte a Proveedor SQL
→ Use abstracción de repositorio para mantener flexibilidad en elección de base de datos.
50) ¿Cómo se integra la inyección de dependencias con DbContext en ASP.NET Core?
Entity Framework se integra perfectamente con el sistema de Inyección de Dependencias (DI) integrado de ASP.NET Core.
Configuración:
services.AddDbContext<AppDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Default"))); Luego inyéctelo en controladores o servicios:
public class CustomerService { private readonly AppDbContext _context; public CustomerService(AppDbContext context) { _context = context; } } Ciclos de Vida:
| Vida | Descripción | Recomendado Para |
|---|---|---|
| Scoped | Un contexto por petición HTTP | Por defecto |
| Transient | Nueva instancia cada vez | Trabajos en background |
| Singleton | Compartido globalmente | Evitar (no thread-safe) |
Usar DI asegura testabilidad, gestión de ciclo de vida y eficiencia de recursos en procesos web y background.
🔍 Principales Preguntas de Entrevista de Entity Framework con Escenarios Reales y Respuestas Estratégicas
1) ¿Qué es Entity Framework y por qué se usa en aplicaciones empresariales?
Esperado del candidato: El entrevistador quiere evaluar su comprensión fundamental de Entity Framework y su valor en aplicaciones reales.
Respuesta de ejemplo: Entity Framework es un framework de Mapeo Objeto-Relacional para .NET que permite a desarrolladores trabajar con bases de datos usando objetos .NET en lugar de SQL crudo. Se usa en aplicaciones empresariales para mejorar productividad, reducir código boilerplate de acceso a datos y mantener una fuerte separación de preocupaciones.
2) ¿Puede explicar la diferencia entre los enfoques Code First, Database First y Model First?
Esperado del candidato: El entrevistador quiere evaluar su conocimiento de diferentes flujos de trabajo de desarrollo y cuándo usar cada uno.
Respuesta de ejemplo: Code First empieza con clases de dominio y genera la base de datos desde código. Database First comienza con una base de datos existente y genera clases de entidad. Model First usa un diseñador visual para definir el modelo y luego crea tanto código como base de datos. Cada enfoque se elige basándose en requisitos del proyecto e infraestructura existente.
3) ¿Cómo maneja Entity Framework las relaciones entre tablas?
Esperado del candidato: El entrevistador está verificando su comprensión de modelado de datos y mapeo relacional.
Respuesta de ejemplo: Entity Framework maneja relaciones usando propiedades de navegación y claves foráneas. Soporta relaciones uno-a-uno, uno-a-muchos y muchos-a-muchos, permitiendo a desarrolladores recorrer datos relacionados usando referencias de objetos en lugar de uniones.
4) Describa una situación donde mejoró el rendimiento de base de datos usando Entity Framework.
Esperado del candidato: El entrevistador quiere escuchar un ejemplo práctico demostrando habilidades de optimización.
Respuesta de ejemplo: En mi rol anterior, mejoré el rendimiento reduciendo carga ansiosa innecesaria e implementando consultas de proyección con sentencias Select. Esto minimizó la cantidad de datos recuperados de la base de datos y redujo significativamente el tiempo de ejecución de consultas.
5) ¿Cómo gestiona migraciones en Entity Framework?
Esperado del candidato: El entrevistador está evaluando su experiencia con cambios de esquema y control de versiones.
Respuesta de ejemplo: Las migraciones se gestionan usando las herramientas de migración integradas que rastrean cambios de modelo con el tiempo. En una posición anterior, generaba y revisaba regularmente scripts de migración antes de aplicarlos para asegurar integridad de base de datos entre entornos.
6) ¿Qué es lazy loading y cuándo evitaría usarlo?
Esperado del candidato: El entrevistador quiere probar su comprensión de estrategias de carga de datos y compromisos de rendimiento.
Respuesta de ejemplo: Lazy loading carga automáticamente datos relacionados cuando se accede a ellos. Evitaría usarlo en escenarios críticos de rendimiento o APIs porque puede causar múltiples llamadas no intencionadas a base de datos, llevando al problema de consultas N+1.
7) ¿Cómo maneja transacciones en Entity Framework?
Esperado del candidato: El entrevistador está evaluando su conocimiento de consistencia de datos y manejo de errores.
Respuesta de ejemplo: Entity Framework soporta transacciones a través de DbContext y TransactionScope. En mi trabajo anterior, usé transacciones explícitas para asegurar que múltiples operaciones de base de datos relacionadas se completaran exitosamente juntas o se revirtieran en caso de fallo.
8) Explique cómo se usa la inyección de dependencias con Entity Framework.
Esperado del candidato: El entrevistador quiere ver qué tan bien entiende la arquitectura de aplicaciones modernas.
Respuesta de ejemplo: La inyección de dependencias se usa para inyectar el DbContext en servicios o controladores. Esto mejora la testabilidad y mantenibilidad permitiendo que el contexto sea mockeado o reemplazado sin cambiar lógica de negocio.
9) Describa un bug desafiante que encontró con Entity Framework y cómo lo resolvió.
Esperado del candidato: El entrevistador busca capacidad de resolución de problemas y habilidades de depuración.
Respuesta de ejemplo: En mi último rol, encontré un problema con conflictos de rastreo al actualizar entidades desacopladas. Lo resolví estableciendo explícitamente estados de entidad y asegurando que solo una instancia de cada entidad era rastreada por el contexto.
10) ¿Cómo decide cuándo Entity Framework no es la herramienta adecuada?
Esperado del candidato: El entrevistador quiere entender su juicio y capacidad para elegir tecnologías apropiadas.
Respuesta de ejemplo: Considero alternativas cuando las aplicaciones requieren acceso a datos de rendimiento extremadamente alto o lógica compleja de stored procedures. En tales casos, usar un micro-ORM o ADO.NET crudo puede proporcionar más control y eficiencia.
Lenguaje C
- Dominando enums en C: Definición, declaración y operaciones de banderas
- Comprenda la precedencia y asociatividad de operadores en C: Guía clara
- Dominando Plantillas en C++: Guía de Programación Genérica
- Entendiendo las clases de almacenamiento en C: auto, extern, static, register explicados
- Domina los operadores de incremento y decremento en C: Uso y mejores prácticas
- Dominando bucles while y do-while en C: ejemplos prácticos
- Control de Flujo en C#: IF, SWITCH, FOR, WHILE – Ejemplos Prácticos y Explicaciones
- Entendiendo C++: Sintaxis Básica y Fundamentos de la Programación Orientada a Objetos
- Entendiendo las reglas de alcance en C: Variables locales, globales y formales
- Polimorfismo en C#: Enlace estático vs dinámico explicado
- Dominando las Interfaces en C#: Definición, Implementación y Casos de Uso Prácticos