then related query net lazyload framework first efcore code asp asnotracking entity-framework entity-framework-4 linq-to-entities

entity-framework - related - include entity framework core



FusiĆ³n de Entity Framework notracking mal funcionamiento (1)

Si deshabilita el seguimiento de cambios configurando la opción de fusión NoTracking , ahorrará los costos de rendimiento de adjuntar objetos a los contextos, pero, por otro lado, también perderá la administración de identidades.

Esto significa que potencialmente muchos más objetos, muchos con la misma clave, se materializarán.

Ejemplo: supongamos que tiene una entidad de User con una colección Roles como propiedad de navegación. Supongamos también que tiene 1 millón de usuarios en la base de datos y todos los usuarios tienen los mismos 10 roles, es decir, cada usuario tiene una colección de roles con 10 elementos. Si ejecuta la siguiente consulta ...

var users = context.Users.Include("Roles").ToList();

... la cantidad de objetos materializados e instanciados depende de la opción de fusión:

  • Si no utiliza NoTracking , tendrá 1.000.010 objetos en memoria, es decir, 1 millón de usuarios, pero solo 10 roles porque el mapeo de identidades garantizará que solo 1 rol por clave se materialice y se una al contexto. Las mismas 10 instancias de rol se utilizan para la colección Roles todos los usuarios.

  • NoTracking embargo, si utiliza NoTracking , EF no adjuntará objetos al contexto, por lo tanto, la gestión de identidades estará desactivada y tendrá 11.000.000 de objetos en la memoria: 1 millón de usuarios y 10 instancias de rol por usuario, es decir, 10 millones de objetos de rol. Por lo tanto, tiene más de 10 veces más objetos materializados que cuando los objetos están unidos al contexto.

La materialización de objetos se clasifica con costos de rendimiento "moderados" :

Operación: Materialización de los objetos
Costo relativo: moderado
Frecuencia: una vez para cada objeto que devuelve una consulta.

Comentarios: El proceso de leer el objeto DbDataReader devuelto y crear objetos y establecer valores de propiedad que se basan en los valores en cada instancia de la clase DbDataRecord. Si el objeto ya existe en ObjectContext y la consulta utiliza las opciones de fusión AppendOnly o PreserveChanges , esta etapa no afecta el rendimiento.

En otras palabras: si la consulta utiliza la opción de fusión NoTracking , esta etapa afecta el rendimiento y es posible que los beneficios de rendimiento del seguimiento de cambios inhabilitados se destruyan por los inconvenientes de la administración de identidad deshabilitada y la materialización de objetos multiplicada.

Tengo un comportamiento extraño al intentar ejecutar una consulta que declara que ObjectQuery MergeOption es "NoTracking", en este caso el marco de entidades no debe adjuntar ninguna entidad y no crear el ObjectStateEntry relativo para rastrear el estado de la entidad.

El problema es que, en lugar de aumentar el rendimiento, empeora, la misma consulta tarda 10 segundos con la combinación predeterminada (que es AppendOnly) y más de 1 minuto si intento especificar notracking

¿Alguien tiene una explicación para esto?