¿Qué diferencia hace .AsNoTracking()?
Tengo una pregunta con respecto a la .AsNoTracking()
extensión, ya que todo esto es bastante nuevo y bastante confuso.
Estoy usando un contexto por solicitud para un sitio web.
Muchas de mis entidades no cambian, por lo que no es necesario realizar un seguimiento, pero tengo el siguiente escenario en el que no estoy seguro de qué va a la base de datos, o incluso si hace una diferencia en este caso.
Este ejemplo es lo que estoy haciendo actualmente:
context.Set<User>().AsNoTracking()
// Step 1) Get user
context.Set<User>()
// Step 2) Update user
Esto es lo mismo que el anterior pero eliminando el .AsNoTracking()
del Paso 1:
context.Set<User>();
// Step 1) Get user
context.Set<User>()
// Step 2) Update user
Los Pasos 1 y 2 utilizan el mismo contexto pero ocurren en momentos diferentes. Lo que no puedo resolver es si hay alguna diferencia. Como el paso 2 es una actualización, supongo que ambos llegarán a la base de datos dos veces de todos modos.
¿Alguien puede decirme cuál es la diferencia?
La diferencia es que en el primer caso el usuario recuperado no es rastreado por el contexto, por lo que cuando vaya a guardar al usuario nuevamente en la base de datos debe adjuntarlo y configurar correctamente el estado del usuario para que EF sepa que debe actualizar el usuario existente. en lugar de insertar uno nuevo. En el segundo caso, no necesita hacerlo si carga y guarda al usuario con la misma instancia de contexto porque el mecanismo de seguimiento lo maneja por usted.
vea esta página Entity Framework y AsNoTracking
¿Qué hace AsNoTracking?
Entity Framework expone una serie de opciones de ajuste del rendimiento para ayudarle a optimizar el rendimiento de sus aplicaciones. Una de estas opciones de ajuste es .AsNoTracking()
. Esta optimización le permite indicar Entity Framework
que no debe realizar un seguimiento de los resultados de una consulta. Esto significa que Entity Framework
no realiza ningún procesamiento ni almacenamiento adicional de las entidades que devuelve la consulta. Sin embargo, también significa que no puede actualizar estas entidades sin volver a adjuntarlas al gráfico de seguimiento.
Se pueden obtener importantes mejoras de rendimiento al utilizar AsNoTracking
Sin seguimiento de consultas de LINQ a entidades
Se recomienda el uso de AsNoTracking() cuando su consulta está destinada a operaciones de lectura. En estos escenarios, recupera sus entidades pero su contexto no las rastrea. Esto garantiza un uso mínimo de memoria y un rendimiento óptimo.
Ventajas
- Rendimiento mejorado con respecto a las consultas LINQ habituales.
- Objetos totalmente materializados.
- Es más sencillo de escribir con sintaxis integrada en el lenguaje de programación.
Contras
- No apto para operaciones CUD.
- Ciertas restricciones técnicas, como: Los patrones que utilizan DefaultIfEmpty para consultas OUTER JOIN dan como resultado consultas más complejas que las simples declaraciones OUTER JOIN en Entity SQL.
- Aún no puedes usar LIKE con la coincidencia de patrones generales.
Más información disponible aquí:
Consideraciones de rendimiento para Entity Framework
Marco de entidad y NoTracking