Skip to main content
EF Core

What is .AsNoTracking() and how can it make your code perform better?

— Christian Schou

Entity Framework is a popular Object-Relational Mapping (ORM) framework used by developers to interact with databases. It provides a set of powerful features that enable developers to perform database operations without having to write SQL queries manually. One such feature is .AsNoTracking(), which is a method used to optimize the performance and memory usage of Entity Framework. 💪

.AsNoTracking() is a method that can be called on a DbSet in Entity Framework to indicate that the retrieved entities should not be tracked by the context. By default, Entity Framework tracks the state of each entity it retrieves, which can lead to increased memory usage and reduced performance, particularly when dealing with large amounts of data. However, by using .AsNoTracking(), you can tell Entity Framework to bypass this tracking mechanism, resulting in faster queries and reduced memory overhead.

In this blog post, I'll explore the benefits of using .AsNoTracking() in Entity Framework and discuss when it's appropriate to use it. I'll also provide some code examples to demonstrate how .AsNoTracking() can improve the performance of your application. 🔥

What is .AsNoTracking()?

.AsNoTracking() is a method provided by Entity Framework that allows you to retrieve data from the database without tracking the state of the retrieved entities? By default, when you retrieve an entity using Entity Framework, it is tracked by the context. This means that Entity Framework keeps track of changes made to the entity and is able to save those changes back to the database when you call SaveChanges(). However, this tracking mechanism can be expensive in terms of memory usage and performance, especially when dealing with large amounts of data.

By using .AsNoTracking(), you can bypass this tracking mechanism and retrieve entities from the database as read-only. This means that Entity Framework will not keep track of any changes made to the entities, and any changes made to the entities will not be persisted in the database when you call SaveChanges().

Here is an example of using .AsNoTracking().

using (var context = new MyDbContext())
{
    var orders = context.Orders.AsNoTracking().ToList();
    // Perform read-only operations on orders
}

In this example, I am retrieving a list of orders from the Orders table using the .AsNoTracking() method. This tells Entity Framework that I only need the entities for read-only purposes and that I don't need to track any changes made to them. This can result in faster queries and reduced memory overhead, especially when dealing with large amounts of data.

In the next section, I'll discuss the benefits of using .AsNoTracking() in Entity Framework.

Benefits of .AsNoTracking()

There are several benefits to using .AsNoTracking() in Entity Framework. Below is a list of three of my primary thoughts when reading the official documentation from Microsoft.

Improved performance

By bypassing the tracking mechanism in Entity Framework, .AsNoTracking() can significantly improve the performance of the application. When retrieving large amounts of data, the tracking mechanism can cause significant overhead, as Entity Framework needs to keep track of each entity and any changes made to them. By using .AsNoTracking(), you can reduce this overhead and retrieve data more quickly.