Back to: Entity Framework Tutorials For Begineers and Professionals
Change Tracking in Entity Framework
In this article, I am going to discuss Change Tracking in Entity Framework Database First Approach with Examples. Please read our previous article where we discussed DbEntityEntry Class in Entity Framework Database First Approach. We are going to work with the same example that we created in our Introduction to Entity Framework Database First Approach article. Please read our Introduction to Entity Framework Database First Approach article before proceeding to this article.
Change Tracking in Entity Framework
Let us understand, how Entity Framework tracks changes in entities during their lifetime. The Entity Framework supports automatic change tracking of the attached entities during the lifetime of the context. The DbChangeTracker class in Entity Framework gives you all the information about current entities which are being tracked by the context object.
Please note that every entity must have a key (primary key) property in order to be tracked by the context object. If the Primary key property is not available, then that entity will not be tracked by the context object.
The following example shows how the Entity Framework context object tracks the entities and the changes that occurred on them.
using System.Data.Entity.Infrastructure;
namespace DBFirstApproach
static void Main(string[] args)
using (EF_Demo_DBEntities context = new EF_Demo_DBEntities())
//Disabling Dynamic Procy
context.Configuration.ProxyCreationEnabled = false;
Console.WriteLine("Find Student Whose Student Id: 1");
var student = context.Students.Find(1);
Console.WriteLine($"Context Object Tracking Changes of {context.ChangeTracker.Entries().Count()} Entities");
DisplayTrackedEntities(context.ChangeTracker);
Console.WriteLine("Find Standard Whose Standard Id: 1");
var standard = context.Standards.Find(1);
Console.WriteLine($"Context Object Tracking Changes of {context.ChangeTracker.Entries().Count()} Entities");
DisplayTrackedEntities(context.ChangeTracker);
Console.WriteLine("Editing Standard Entity");
student.FirstName = "FirstName Updated";
DisplayTrackedEntities(context.ChangeTracker);
Console.WriteLine("Editing Standard Entity");
standard.StandardName = "Standard Name Updated";
DisplayTrackedEntities(context.ChangeTracker);
//Creating a New Teacher Emtity
Console.WriteLine("Adding New Teacher into the Context");
Teacher tchr = new Teacher() { FirstName = "Pranaya", LastName = "Rout" };
context.Teachers.Add(tchr);
Console.WriteLine($"Context Object Tracking Changes of {context.ChangeTracker.Entries().Count()} Entities");
DisplayTrackedEntities(context.ChangeTracker);
Console.WriteLine("Remove Student Entity From the Context");
context.Students.Remove(student);
Console.WriteLine($"Context Object Tracking Changes of {context.ChangeTracker.Entries().Count()} Entities");
DisplayTrackedEntities(context.ChangeTracker);
private static void DisplayTrackedEntities(DbChangeTracker changeTracker)
// Gets the DbEntityEntry objects for all the entities tracked by the context object.
var entries = changeTracker.Entries();
foreach (DbEntityEntry entry in entries)
Console.WriteLine($"\nEntity Name: {entry.Entity.GetType().FullName}");
Console.WriteLine($"Entity State: {entry.State}");
Console.WriteLine("\n---------------------------------------");
using System;
using System.Data.Entity.Infrastructure;
using System.Linq;
namespace DBFirstApproach
{
class Program
{
static void Main(string[] args)
{
using (EF_Demo_DBEntities context = new EF_Demo_DBEntities())
{
//Disabling Dynamic Procy
context.Configuration.ProxyCreationEnabled = false;
Console.WriteLine("Find Student Whose Student Id: 1");
var student = context.Students.Find(1);
Console.WriteLine($"Context Object Tracking Changes of {context.ChangeTracker.Entries().Count()} Entities");
DisplayTrackedEntities(context.ChangeTracker);
Console.WriteLine("Find Standard Whose Standard Id: 1");
var standard = context.Standards.Find(1);
Console.WriteLine($"Context Object Tracking Changes of {context.ChangeTracker.Entries().Count()} Entities");
DisplayTrackedEntities(context.ChangeTracker);
Console.WriteLine("");
Console.WriteLine("Editing Standard Entity");
student.FirstName = "FirstName Updated";
DisplayTrackedEntities(context.ChangeTracker);
Console.WriteLine("");
Console.WriteLine("Editing Standard Entity");
standard.StandardName = "Standard Name Updated";
DisplayTrackedEntities(context.ChangeTracker);
//Creating a New Teacher Emtity
Console.WriteLine("Adding New Teacher into the Context");
Teacher tchr = new Teacher() { FirstName = "Pranaya", LastName = "Rout" };
context.Teachers.Add(tchr);
Console.WriteLine($"Context Object Tracking Changes of {context.ChangeTracker.Entries().Count()} Entities");
DisplayTrackedEntities(context.ChangeTracker);
Console.WriteLine("");
Console.WriteLine("Remove Student Entity From the Context");
context.Students.Remove(student);
Console.WriteLine($"Context Object Tracking Changes of {context.ChangeTracker.Entries().Count()} Entities");
DisplayTrackedEntities(context.ChangeTracker);
}
Console.Read();
}
private static void DisplayTrackedEntities(DbChangeTracker changeTracker)
{
// Gets the DbEntityEntry objects for all the entities tracked by the context object.
var entries = changeTracker.Entries();
foreach (DbEntityEntry entry in entries)
{
Console.WriteLine($"\nEntity Name: {entry.Entity.GetType().FullName}");
Console.WriteLine($"Entity State: {entry.State}");
}
Console.WriteLine("\n---------------------------------------");
}
}
}
using System;
using System.Data.Entity.Infrastructure;
using System.Linq;
namespace DBFirstApproach
{
class Program
{
static void Main(string[] args)
{
using (EF_Demo_DBEntities context = new EF_Demo_DBEntities())
{
//Disabling Dynamic Procy
context.Configuration.ProxyCreationEnabled = false;
Console.WriteLine("Find Student Whose Student Id: 1");
var student = context.Students.Find(1);
Console.WriteLine($"Context Object Tracking Changes of {context.ChangeTracker.Entries().Count()} Entities");
DisplayTrackedEntities(context.ChangeTracker);
Console.WriteLine("Find Standard Whose Standard Id: 1");
var standard = context.Standards.Find(1);
Console.WriteLine($"Context Object Tracking Changes of {context.ChangeTracker.Entries().Count()} Entities");
DisplayTrackedEntities(context.ChangeTracker);
Console.WriteLine("");
Console.WriteLine("Editing Standard Entity");
student.FirstName = "FirstName Updated";
DisplayTrackedEntities(context.ChangeTracker);
Console.WriteLine("");
Console.WriteLine("Editing Standard Entity");
standard.StandardName = "Standard Name Updated";
DisplayTrackedEntities(context.ChangeTracker);
//Creating a New Teacher Emtity
Console.WriteLine("Adding New Teacher into the Context");
Teacher tchr = new Teacher() { FirstName = "Pranaya", LastName = "Rout" };
context.Teachers.Add(tchr);
Console.WriteLine($"Context Object Tracking Changes of {context.ChangeTracker.Entries().Count()} Entities");
DisplayTrackedEntities(context.ChangeTracker);
Console.WriteLine("");
Console.WriteLine("Remove Student Entity From the Context");
context.Students.Remove(student);
Console.WriteLine($"Context Object Tracking Changes of {context.ChangeTracker.Entries().Count()} Entities");
DisplayTrackedEntities(context.ChangeTracker);
}
Console.Read();
}
private static void DisplayTrackedEntities(DbChangeTracker changeTracker)
{
// Gets the DbEntityEntry objects for all the entities tracked by the context object.
var entries = changeTracker.Entries();
foreach (DbEntityEntry entry in entries)
{
Console.WriteLine($"\nEntity Name: {entry.Entity.GetType().FullName}");
Console.WriteLine($"Entity State: {entry.State}");
}
Console.WriteLine("\n---------------------------------------");
}
}
}
Output:
Find Student Whose Student Id: 1
Context Object Tracking Changes of 1 Entities
Entity Name: DBFirstApproach.Student
---------------------------------------
Find Standard Whose Standard Id: 1
Context Object Tracking Changes of 2 Entities
Entity Name: DBFirstApproach.Student
Entity Name: DBFirstApproach.Standard
---------------------------------------
Entity Name: DBFirstApproach.Student
Entity Name: DBFirstApproach.Standard
---------------------------------------
Entity Name: DBFirstApproach.Student
Entity Name: DBFirstApproach.Standard
---------------------------------------
Adding New Teacher into the Context
Context Object Tracking Changes of 3 Entities
Entity Name: DBFirstApproach.Teacher
Entity Name: DBFirstApproach.Student
Entity Name: DBFirstApproach.Standard
---------------------------------------
Remove Student Entity From the Context
Context Object Tracking Changes of 3 Entities
Entity Name: DBFirstApproach.Teacher
Entity Name: DBFirstApproach.Standard
Entity Name: DBFirstApproach.Student
---------------------------------------
Find Student Whose Student Id: 1
Context Object Tracking Changes of 1 Entities
Entity Name: DBFirstApproach.Student
Entity State: Unchanged
---------------------------------------
Find Standard Whose Standard Id: 1
Context Object Tracking Changes of 2 Entities
Entity Name: DBFirstApproach.Student
Entity State: Unchanged
Entity Name: DBFirstApproach.Standard
Entity State: Unchanged
---------------------------------------
Editing Standard Entity
Entity Name: DBFirstApproach.Student
Entity State: Modified
Entity Name: DBFirstApproach.Standard
Entity State: Unchanged
---------------------------------------
Editing Standard Entity
Entity Name: DBFirstApproach.Student
Entity State: Modified
Entity Name: DBFirstApproach.Standard
Entity State: Modified
---------------------------------------
Adding New Teacher into the Context
Context Object Tracking Changes of 3 Entities
Entity Name: DBFirstApproach.Teacher
Entity State: Added
Entity Name: DBFirstApproach.Student
Entity State: Modified
Entity Name: DBFirstApproach.Standard
Entity State: Modified
---------------------------------------
Remove Student Entity From the Context
Context Object Tracking Changes of 3 Entities
Entity Name: DBFirstApproach.Teacher
Entity State: Added
Entity Name: DBFirstApproach.Standard
Entity State: Modified
Entity Name: DBFirstApproach.Student
Entity State: Deleted
---------------------------------------
Find Student Whose Student Id: 1
Context Object Tracking Changes of 1 Entities
Entity Name: DBFirstApproach.Student
Entity State: Unchanged
---------------------------------------
Find Standard Whose Standard Id: 1
Context Object Tracking Changes of 2 Entities
Entity Name: DBFirstApproach.Student
Entity State: Unchanged
Entity Name: DBFirstApproach.Standard
Entity State: Unchanged
---------------------------------------
Editing Standard Entity
Entity Name: DBFirstApproach.Student
Entity State: Modified
Entity Name: DBFirstApproach.Standard
Entity State: Unchanged
---------------------------------------
Editing Standard Entity
Entity Name: DBFirstApproach.Student
Entity State: Modified
Entity Name: DBFirstApproach.Standard
Entity State: Modified
---------------------------------------
Adding New Teacher into the Context
Context Object Tracking Changes of 3 Entities
Entity Name: DBFirstApproach.Teacher
Entity State: Added
Entity Name: DBFirstApproach.Student
Entity State: Modified
Entity Name: DBFirstApproach.Standard
Entity State: Modified
---------------------------------------
Remove Student Entity From the Context
Context Object Tracking Changes of 3 Entities
Entity Name: DBFirstApproach.Teacher
Entity State: Added
Entity Name: DBFirstApproach.Standard
Entity State: Modified
Entity Name: DBFirstApproach.Student
Entity State: Deleted
---------------------------------------
As you can see in the output, the context object in Entity Framework keeps track of entities whenever we retrieve the entity, add a new entity, modify an existing entity, or delete an existing entity.
In the next article, I am going to discuss Logging Database Commands in Entity Framework Database First Approach with Examples. Here, in this article, I try to explain Change Tracking in Entity Framework Database First Approach with Examples. I hope you enjoy this Change Tracking in Entity Framework Database First Approach article.
About the Author: Pranaya Rout
Pranaya Rout has published more than 3,000 articles in his 11-year career. Pranaya Rout has very good experience with Microsoft Technologies, Including C#, VB, ASP.NET MVC, ASP.NET Web API, EF, EF Core, ADO.NET, LINQ, SQL Server, MYSQL, Oracle, ASP.NET Core, Cloud Computing, Microservices, Design Patterns and still learning new technologies.