EF Core - Change Tracking trong Entity Framework

Change Tracking trong Entity Framework

Change tracking là gì?

Ở bài viết này, bạn sẽ tìm hiểu cách Entity Framework (EF) theo dõi các thay đổi (change tracking) trên các thực thể trong suốt vòng đời của chúng.

Entity Framework (EF) hỗ trợ theo dõi thay đổi tự động của các thực thể được tải trong suốt vòng đời của Context - lớp SchoolDBEntities. Lớp DbChangeTracker cung cấp cho bạn tất cả các thông tin về các thực thể đang được theo dõi bởi Context.

Xin lưu ý rằng mọi thực thể phải có thuộc tính khóa (khóa chính) để được theo dõi bởi Context. Entity Framework (EF) sẽ không thêm bất kỳ thực thể nào trong mô hình khái niệm không có thuộc tính EntityKey.

Change tracking trong Entity Framework

Đoạn mã sau đây cho thấy cách lớp Context theo dõi các thực thể và các thay đổi xảy ra trên chúng:

static void Main(string[] args)
{
    using (var ctx = new SchoolDBEntities())
    {

        Console.WriteLine("Find Student");
        var std1 = ctx.Students.Find(1);

        Console.WriteLine("Context tracking changes of {0} entity.", ctx.ChangeTracker.Entries().Count());

        DisplayTrackedEntities(ctx.ChangeTracker);

        Console.WriteLine("Find Standard");

        var standard = ctx.Standards.Find(1);

        Console.WriteLine("Context tracking changes of {0} entities.", ctx.ChangeTracker.Entries().Count());
        Console.WriteLine("");
        Console.WriteLine("Editing Standard");
                
        standard.StandardName = "Edited name";
        DisplayTrackedEntities(ctx.ChangeTracker);


        Teacher tchr = new Teacher() { TeacherName = "new teacher" };
        Console.WriteLine("Adding New Teacher");

        ctx.Teachers.Add(tchr);
        Console.WriteLine("");
        Console.WriteLine("Context tracking changes of {0} entities.", ctx.ChangeTracker.Entries().Count());
        DisplayTrackedEntities(ctx.ChangeTracker);

        Console.WriteLine("Remove Student");
        Console.WriteLine("");

        ctx.Students.Remove(std1);
        DisplayTrackedEntities(ctx.ChangeTracker);
    }
}

private static void DisplayTrackedEntities(DbChangeTracker changeTracker)
{
    Console.WriteLine("");

    var entries = changeTracker.Entries();
    foreach (var entry in entries)
    {
        Console.WriteLine("Entity Name: {0}", entry.Entity.GetType().FullName);
        Console.WriteLine("Status: {0}", entry.State);
    }
    Console.WriteLine("");
    Console.WriteLine("---------------------------------------");
}

Đây là kết quả khi biên dịch và thực thi:

Find Student
Context tracking changes of 1 entity.

Entity Name: Comdy.Student
Status: Unchanged

---------------------------------------
Find Standard
Context tracking changes of 2 entities.

Editing Standard

Entity Name: Comdy.Standard
Status: Modified
Entity Name: Comdy.Student
Status: Unchanged

---------------------------------------
Adding New Teacher

Context tracking changes of 3 entities.

Entity Name: Comdy.Teacher
Status: Added
Entity Name: Comdy.Standard
Status: Modified
Entity Name: Comdy.Student
Status: Unchanged

---------------------------------------
Remove Student

Entity Name: Comdy.Teacher
Status: Added
Entity Name: Comdy.Standard
Status: Modified
Entity Name: Comdy.Student
Status: Deleted

---------------------------------------

Như bạn có thể thấy trong đoạn mã và kết quả ở trên, Context sẽ theo dõi các thực thể bất cứ khi nào chúng tôi truy xuất, thêm, sửa đổi hoặc xóa một thực thể.

Xin lưu ý rằng Context vẫn còn tồn tại trong khi xảy ra bất kỳ thao tác nào trên các thực thể. Context sẽ không theo dõi nếu bạn thực hiện bất kỳ thao tác nào trên các thực thể nằm ngoài phạm vi của nó.