EF 6 - Change Tracking

Change Tracking trong EF 6

Ở phần này bạn sẽ học được làm thế nào Entity Framework theo dõi những thay đổi trên thực thể suốt vòng đời của nó.

Entity Framework hỗ trợ tự động theo dõi thay đổi của những thực thể đã tải suốt vòng đời của context. Lớp DbChangeTracker đưa cho bạn tất cả thông tin về những thực thể hiện tại đang được theo dõi bởi context.

Vui lòng lưu ý rằng mỗi thực thể phải có thuộc tính EntityKey (khóa chính) để được theo dõi bởi context. Entity Framework sẽ không thêm bất kỳ thực thể nào trong conceptual model mà không có một thuộc tính EntityKey.

Đoạn mã sau trình bày làm thế nào lớp context theo dõi những thực thể và sự thay đổi xảy ra trong nó:

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("---------------------------------------");
}

Kết quả:

Find Student
Context tracking changes of 1 entity.

Entity Name: EFTutorials.Student
Status: Unchanged

Find Standard
Context tracking changes of 2 entities.

Editing Standard

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

Adding New Teacher

Context tracking changes of 3 entities.

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

Remove Student

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

Như bạn có thể nhìn thấy ở ví dụ trên và output, context giữ việc theo dõi những thực thể bất cứ khi nào chúng nhận, thêm, điều chỉnh hoặc xóa thực thể. Vui lòng lưu ý rằng context tồn tại  suốt  quá trình hoạt động trên những thực thể. Context sẽ không giữ theo dõi nếu bạn thực hiện bất kỳ thao tác nào trên thực thể bên ngoài phạm vi của nó.