Entity Framework中的变更跟踪
在这里,您将了解Entity Framework如何在实体的生命周期内跟踪实体上的更改。
实体框架支持在上下文的生命周期内对加载的实体进行自动更改跟踪。DbChangeTracker类提供了上下文正在跟踪的当前实体的所有信息。
请注意,每个实体必须有一个键(主键)属性,以便由上下文跟踪(EF、EF Core中主键的重要性)。实体框架不会在概念模型中添加任何没有EntityKey属性的实体。
下面的代码片段显示了上下文类如何跟踪实体以及发生在实体上的更改:
static void Main(string[] args)
{
using (var ctx = new SchoolDBEntities())
{
Console.WriteLine("Find Student");
var std1 = ctx.Students.Find(1);
Console.WriteLine("Context tracking changes of {0} entity.", ctx.ChangeTracker.Entries().Count());
DisplayTrackedEntities(ctx.ChangeTracker);
Console.WriteLine("Find Standard");
var standard = ctx.Standards.Find(1);
Console.WriteLine("Context tracking changes of {0} entities.", ctx.ChangeTracker.Entries().Count());
Console.WriteLine("");
Console.WriteLine("Editing Standard");
standard.StandardName = "Edited name";
DisplayTrackedEntities(ctx.ChangeTracker);
Teacher tchr = new Teacher() { TeacherName = "new teacher" };
Console.WriteLine("Adding New Teacher");
ctx.Teachers.Add(tchr);
Console.WriteLine("");
Console.WriteLine("Context tracking changes of {0} entities.", ctx.ChangeTracker.Entries().Count());
DisplayTrackedEntities(ctx.ChangeTracker);
Console.WriteLine("Remove Student");
Console.WriteLine("");
ctx.Students.Remove(std1);
DisplayTrackedEntities(ctx.ChangeTracker);
}
}
private static void DisplayTrackedEntities(DbChangeTracker changeTracker)
{
Console.WriteLine("");
var entries = changeTracker.Entries();
foreach (var entry in entries)
{
Console.WriteLine("Entity Name: {0}", entry.Entity.GetType().FullName);
Console.WriteLine("Status: {0}", entry.State);
}
Console.WriteLine("");
Console.WriteLine("---------------------------------------");
}
Output:
Find Student
Context tracking changes of 1 entity.
Entity Name: EFTutorials.Student
Status: Unchanged
---------------------------------------
Find Standard
Context tracking changes of 2 entities.
Editing Standard
Entity Name: EFTutorials.Standard
Status: Modified
Entity Name: EFTutorials.Student
Status: Unchanged
---------------------------------------
Adding New Teacher
Context tracking changes of 3 entities.
Entity Name: EFTutorials.Teacher
Status: Added
Entity Name: EFTutorials.Standard
Status: Modified
Entity Name: EFTutorials.Student
Status: Unchanged
---------------------------------------
Remove Student
Entity Name: EFTutorials.Teacher
Status: Added
Entity Name: EFTutorials.Standard
Status: Modified
Entity Name: EFTutorials.Student
Status: Deleted
---------------------------------------
正如您在上面的示例代码片段和输出中所看到的,每当我们查询、添加、修改或删除实体时,上下文都会跟踪实体。请注意,在对实体进行任何操作时,上下文都是活动的。如果您对超出其作用域的实体执行任何操作,上下文将不会跟踪。
参考
https://www.entityframeworktutorial.net/
https://msdn.microsoft.com/