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