Wednesday, 14 June 2017

Entity Framework and AsNoTracking

In the Entity Framework based applications, the DbContext / Object Context is responsible for tracking the changes done in the objects, so the correct update is done to the database when the SaveChanges() method of the context is called. When we retrieve entities using an object query, the Entity Framework puts these entities in a cache and tracks whatever changes are made on these entities until the savechanges method is called.
Sometimes we do not want to track some entities because the data is only used for viewing purposes and other operations such as insert, update and delete are not done. For example the view data in a read-only grid.
The AsNoTracking() extension method returns a new query and the returned entities will not be cached by the context (DbContext or Object Context). This means that the Entity Framework does not perform any additional processing or storage of the entities that are returned by the query. Please note that we cannot update these entities without attaching to the context.

How to use AsNoTracking:
The “System.Data.Entity” namespace contains this extension and it is very easy to use in our applications. The following is an example of how to use the AsNoTracking method.
The first query returns all the employees from the database table and we apply the AsNoTrack method on the DbQuery object. The second query returns all the employee rows with an EmployeeId greater than or equal to 3 and here we apply the AsNoTrack method on the IQueryable object.
  1. using(Entities context = new Entities())  
  2. {  
  3.     var employee = context.Employees.AsNoTracking().ToList();  
  4.     var employee2 = context.Employees  
  5.                     .Where(p => p.EmployeeId >= 3)  
  6.                     .AsNoTracking().ToList();  
  7. } 

Query performance with AsNoTracking:
The AsNoTracking method can save both execution times and memory usage. Applying this option really becomes important when we retrieve a large amount of data from the database.
Consider the following example code. Here I am querying an employee entity with and without the AsNoTrack method. To analyze the SQL query and execution time, I am enabling the SQL logging feature of the Entity Framework.
  1. using(Entities context = new Entities())  
  2. {  
  3.     var employeeWith = context.Employees.AsNoTracking().ToList();  
  4.     var employeeWithout = context.Employees.ToList();   
  5. } 

Output:








No comments:

Post a Comment