站点图标 江湖人士

EF Core跟踪实体图ChangeTracker.TrackGraph()

EF Core获取上下文SQL语句

EF Core获取上下文SQL语句

上一篇文章中,我们学习了在Entity Framework Core 使用不同的方法设置实体状态EntityState。在本篇文章中,我们将学习如何跟踪实体图【EF Core跟踪实体图ChangeTracker.TrackGraph()】,并为每个实体设置合适的实体状态EntityState

EF Core跟踪实体图

认识Entity Framework Core的DbContext类

本篇文章的主角 ChangeTracker.TrackGraph()方法在Entity Framework Core中引入,用于跟踪整个实体图并将自定义实体状态设置为图中的每个实体。

方法签名:
public virtual void TrackGraph(object rootEntity,Action<EntityEntryGraphNode> callback)

ChangeTracker.TrackGraph()方法开始跟踪实体以及通过遍历其导航属性可到达的任何实体。为每个发现的实体调用指定的回调,并且EntityState必须为每个实体设置适当的回调。回调函数允许我们实现自定义逻辑来设置适当的状态。如果未设置任何状态,则实体保持未跟踪状态。

以下示例演示了该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()} ");
}
Output:
Entity: Student, State: Added 
Entity: StudentAddress, State: Unchanged
Entity: StudentCourse, State: Added 
Entity: Course, State: Added 
Entity: StudentCourse, State: Added 
Entity: Course, State: Unchanged

在上面的示例中,该ChangeTracker.TrackGraph()方法用于为Student实体图中的每个实体设置状态。第一个参数是实体图,第二个参数是设置每个实体的状态的函数。我们使用lambda表达式为具有有效键值的实体设置Unchanged状态,为具有空键值的实体设置Added状态。IsKeySet当实体具有有效的键属性值时,该值变为true。

因此,我们可以使用该ChangeTracker.TrackGraph()方法为跟踪图中的每个实体设置不同的实体状态EntityState

退出移动版