Entity Framework Core系列教程-22-跟踪实体图(TrackGraph)

Entity Framework Core中的ChangeTracker.TrackGraph()

在上一章中,您了解了不同的方法为Entity Framework Core 2中的实体图的每个实体设置不同的EntityState。在这里,您将学习如何跟踪实体图并为图中的每个单个实体设置适当的EntityState。
Entity Framework Core中引入了ChangeTracker.TrackGraph()方法,以跟踪整个实体图并将自定义实体状态设置为图中的每个实体。
方法签名: 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()方法用于为学生实体图中的每个实体设置状态。第一个参数是实体图,第二个参数是设置每个实体状态的函数。我们使用lambda表达式为具有有效键值的实体设置了“不变”状态,为具有空键值的实体设置了“添加”状态。当实体具有有效的键属性值时,IsKeySet变为true。
因此,我们可以使用ChangeTracker.TrackGraph()方法为图中的每个实体设置不同的EntityState。

posted @ 2020-02-08 20:31  星空天宇  阅读(168)  评论(0编辑  收藏  举报