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