Entity Framework Core 2.1: Usando NoTracking (mayor eficiencia)

Sabemos que una manera de actualizar un registro utilizando Entity Framework es trayendo ese registro, actualizar alguno de sus valores, y luego utilizar la función SaveChanges para guardar los cambios en la base de datos. La razón por la que podemos hacer esto es porque por defecto, cuando traemos registros de la base de datos utilizando EF, este se mantiene dándole seguimiento a cualquier cambio que ocurra en alguna de las propiedades de los objetos creados con un query. Ciertamente, esta funcionalidad tiene un costo en términos de rendimiento de la aplicación. Si sabes que no vas a realizar cambios sobre los objetos de manera inmediata, entonces tienes la oportunidad de apagar este “seguimiento” que hace EF Core sobre los objetos. Para esto utilizamos la función AsNoTracking.

La función AsNoTracking, que quiere decir “sin seguimiento”, sirve para evitar que EF Core le dé seguimiento a los cambios realizados a los objetos que fueron creados a partir de un query. Esto hará que tu aplicación ejecute los queries más rápidamente. Veamos un ejemplo:

using (var context = new ApplicationDbContext())
{
   var students = context.Students.AsNoTracking().ToList();
}

Ya con esto, a ese listado de estudiantes EF Core no le está dando seguimiento, lo que implica que, si le editamos alguna de sus propiedades, y luego hacemos SaveChanges, los cambios no serán realizados en la base de datos.

Si en un contexto vas a realizar varios queries, y quieres que todos usen el AsNoTracking de manera automática, entonces puedes cambiar el comportamiento del seguidor de cambios (ChangeTracker) a nivel global:

using (var context = new ApplicationDbContext())
{
   context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
   var students = context.Students.ToList();
   var course = context.Courses.FirstOrDefault();
}

Siempre que haya una entidad como resultado de un query, por defecto, a esta se le van a aplicar los seguimientos a menos que uses algunos de los métodos anteriores para evitarlo. Si usas un select para generar algo que no sea una entidad, entonces EF Core no va a aplicar la funcionalidad de seguimiento de manera automática, en tal sentido, la función AsNoTracking no es necesaria que sea utilizada:

using (var context = new ApplicationDbContext())
{
   // No se les dará seguimiento
   var studentsIds = context.Students.Select(x => x.Id).ToList();
   var studentsBasicData = context.Students.Select(x => new { x.Id, x.Name }).ToList();
}

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s