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ó.

Entity Framework
Bài Viết Liên Quan:
2 kịch bản lưu dữ liệu trong Entity Framework Core
Trung Nguyen 30/04/2020
2 kịch bản lưu dữ liệu trong Entity Framework Core

2 kịch bản lưu dữ liệu trong Entity Framework Core là kịch bản được kết nối và kịch bản ngắt kết nối.

Ứng dụng Entity Framework Core đầu tiên
Trung Nguyen 29/04/2020
Ứng dụng Entity Framework Core đầu tiên

Tạo ứng dụng .NET Core Console đầu tiên và cấu hình sử dụng Entity Framework Core.

Truy vấn trong Entity Framework Core
Trung Nguyen 29/04/2020
Truy vấn trong Entity Framework Core

Truy vấn trong Entity Framework Core có gì mới? Truy vấn trong EF Core khác EF ở những điểm nào.

Entity Framework Core toàn tập
Trung Nguyen 29/04/2020
Entity Framework Core toàn tập

Entity Framework Core toàn tập sẽ hướng dẫn bạn tất cả mọi thứ về Entity Framework Core.