¿Qué diferencia hace .AsNoTracking ()?

Tengo una pregunta sobre la extensión .AsNoTracking() , 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 hacer un seguimiento, pero tengo la siguiente situación en la que no estoy seguro de qué es lo que 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().AsNoTracking() // Step 1) Get user context.Set() // Step 2) Update user 

Este es el mismo que el anterior pero eliminando .AsNoTracking() del Paso 1:

 context.Set(); // Step 1) Get user context.Set() // Step 2) Update user 

Los pasos 1 y 2 usan 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.

¿Alguien puede decirme cuál es la diferencia?

La diferencia es que, en el primer caso, el contexto no rastrea al usuario recuperado, por lo que cuando va a guardar el usuario en la base de datos debe adjuntarlo y establecer el estado del usuario para que EF sepa que debe actualizar al usuario existente. en lugar de insertar uno nuevo En el segundo caso, no necesita hacer eso si carga y guarda al usuario con la misma instancia de contexto porque el mecanismo de seguimiento maneja eso por usted.

vea esta página Entity Framework y AsNoTracking

Lo que hace AsNoTracking

Entity Framework expone varias opciones de ajuste de rendimiento para ayudarlo a optimizar el rendimiento de sus aplicaciones. Una de estas opciones de ajuste es .AsNoTracking() . Esta optimización le permite decirle a Entity Framework no rastree los resultados de una consulta. Esto significa que Entity Framework no realiza procesamiento o almacenamiento adicional de las entidades que devuelve la consulta. Sin embargo, también significa que no puede actualizar estas entidades sin volver a conectarlas al gráfico de seguimiento.

hay ganancias de rendimiento significativas con AsNoTracking

Sin seguimiento de consultas de LINQ a Entidades

Se recomienda el uso de NoTracking () 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 la memoria y un rendimiento óptimo.

Pros

  1. Rendimiento mejorado sobre consultas LINQ regulares.
  2. Objetos completamente materializados
  3. Lo más simple es escribir con la syntax integrada en el lenguaje de progtwigción.

Contras

  1. No es adecuado para operaciones CUD.
  2. Ciertas restricciones técnicas, como: Los patrones que usan DefaultIfEmpty para las consultas OUTER JOIN generan consultas más complejas que las simples declaraciones OUTER JOIN en Entity SQL.
  3. Aún no puedes usar LIKE con la coincidencia general de patrones.

Más información disponible aquí:

Consideraciones de rendimiento para Entity Framework

Entity Framework y NoTracking

Deshabilitar el seguimiento también hará que sus conjuntos de resultados se transmitan a la memoria. Esto es más eficiente cuando trabajas con grandes conjuntos de datos y no necesitas todo el conjunto de datos a la vez.

Referencias

  • Cómo evitar el desbordamiento de memoria al consultar grandes conjuntos de datos con Entity Framework y LINQ
  • Conjunto grande de datos del marco de entidades, excepción de falta de memoria

AsNoTracking () permite eludir el requisito de “clave única por registro” en EF (no mencionado explícitamente por otras respuestas).

Esto es extremadamente útil cuando se lee una vista que no admite una clave única porque tal vez algunos campos son anulables o la naturaleza de la vista no es indexable lógicamente.

Para estos casos, la “clave” se puede establecer en cualquier columna que no se pueda nulos, pero luego se debe usar AsNoTracking () con cada consulta, los registros de otros (duplicados por clave) se omitirán.

Si tiene algo más que altera el DB (digamos otro proceso) y necesita asegurarse de ver estos cambios, use AsNoTracking() ; de lo contrario, EF puede darle la última copia que tuvo su contexto, por lo tanto es bueno usar un nuevo contexto cada consulta:

http://codethug.com/2016/02/19/Entity-Framework-Cache-Busting/