EF Core - Tracking Entity Graph

ChangeTracker.TrackGraph() trong Entity Framework Core

 

Trong phần trước, chúng ta đã biết rằng các phương pháp khác nhau gán EntityState khác nhau cho từng thực thể của biểu đồ thực thể trong Entity Framework Core 2. Bây giờ, chúng ta sẽ học cách theo dõi biểu đồ thực thể và gán EntityState thích hợp cho từng thực thể riêng lẻ trong biểu đồ.

Phương thức ChangeTracker.TrackGraph() đã được giới thiệu trong Entity Framework Core để theo dõi toàn bộ biểu đồ thực thể và gán trạng thái thực thể tùy chỉnh cho từng thực thể trong biểu đồ.

Cú pháp:

public virtual void TrackGraph(object rootEntity, Action<EntityEntryGraphNode> callback)

Phương thức ChangeTracker.TrackGraph() bắt đầu theo dõi một thực thể và bất kỳ thực thể nào có thể truy cập được bằng cách duyệt qua các thuộc tính điều hướng của nó. Lệnh callback   được gọi cho mỗi thực thể được phát hiện và một EntityState thích hợp gán cho mỗi thực thể. Hàm callback cho phép chúng ta thực hiện một logic tùy chỉnh để thiết lập trạng thái thích hợp. Nếu không có trạng thái nào được gán, thực thể vẫn chưa được theo dõi.

Ví dụ sau minh họa phương thức TrackGraph.

var student = new Student() { //Root entity (with key value)
    StudentId = 1,
    Name = "Bill",
    Address = new StudentAddress()  //Child entity (with key value)
    {
        StudentAddressId = 1,
        City = "Seattle",
        Country = "USA"
    },
    StudentCourses = new List<StudentCourse>() {
            new StudentCourse(){  Course = new Course(){ CourseName="Machine Language" } },//Child entity (empty key)
            new StudentCourse(){  Course = new Course(){  CourseId=2 } } //Child entity (with key value)
        }
};
       
var context = new SchoolContext();
            
context.ChangeTracker.TrackGraph(student, e => {
                                                if (e.Entry.IsKeySet)
                                                {
                                                    e.Entry.State = EntityState.Unchanged;
                                                }
                                                else
                                                {
                                                    e.Entry.State = EntityState.Added;
                                                }
                                            });

foreach (var entry in context.ChangeTracker.Entries())
{
    Console.WriteLine($"Entity: {entry.Entity.GetType().Name}, 
                        State: {entry.State.ToString()} ");
}

Kết quả:

Entity: Student, State: Added
Entity: StudentAddress, State: Unchanged
Entity: StudentCourse, State: Added
Entity: Course, State: Added
Entity: StudentCourse, State: Added
Entity: Course, State: Unchanged

Trong ví dụ trên, phương thức ChangeTracker.TrackGraph() được sử dụng để gán trạng thái cho từng thực thể trong biểu đồ thực thể Student. Tham số đầu tiên là một đồ thị thực thể và tham số thứ hai là một hàm gán trạng thái của mỗi thực thể. Chúng ta đã sử dụng biểu thức lambda để gán trạng thái Unchanged cho các thực thể có giá trị khóa hợp lệ và trạng thái Added  cho các thực thể có giá trị khóa trống. IsKeySet trở thành true khi một thực thể có giá trị thuộc tính khóa hợp lệ.

Vì vậy, chúng ta có thể sử dụng phương thức ChangeTracker.TrackGraph() để đặt các EntityState khác nhau cho mỗi thực thể trong một biểu đồ.