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。