要专业系统地学习EF推荐《你必须掌握的Entity Framework 6.x与Core 2.0》。这本书作者(汪鹏,Jeffcky)的博客:https://www.cnblogs.com/CreateMyself/
快照追踪、代理追踪、DetectChanges让我很疑惑
这一节内容看的真的相当疑惑。
上次我们了解到变更追踪两种方式:快照追踪、代理追踪
快照追踪通过将POCO和快照进行比较得到哪些内容被更改,EF才知道对数据库做哪种操作。
代理追踪方式没有生成快照,他是通过重写我们的POCO生成一个代理类,因为重写它可以加入自己的代码,实现更改通知的机制。
他们两者的性能没有什么区别。
那么我们看看快照追踪,它到底是怎么比较的?其实他是调用的DetectChanges方法。detectChanges是SaveChanges方法实现的一部分,当我们调用该SvaeChanges时会调用DetectChangs
但是并不是只有saveChanges会调用DetectChanges,还有如下的方法
DbSet.Find DbSet.Load DbSet.Remove DbSet.Add DbSet.Attach DbContext.SaveChanges DbContext.GetValidationErrors DbContext.Entity DbChangeTraker.Entries
通过上一节的内容我认识到,DetectChanges方法非常重要,快照追踪方式必须要调用它才行
那么这节内容的告诉我们:不需要调用DetectChanges方式也可以
那么,不调用DetectChanges方法,那么EF使用的是快照追踪还是代理追踪??
我只能猜测是这样一种情况:如果关闭自动追踪,而且还要正常操作数据,那么现在这种,就已经没有了追踪的概念
我这都已经到了猜测的地步了,所以大家请不要轻信我说的话
既然不需要调用DetectChanges方式也可以,那么我们来试一下。数据中没有任何变化
// 关闭自动追踪 ctx.Configuration.AutoDetectChangesEnabled = false; var store = ctx.Stores.FirstOrDefault(); Console.WriteLine(ctx.Entry(store).State); // Unchanged Console.WriteLine(store.Name); // 王银河商店 store.Name = "四海商店"; Console.WriteLine(ctx.Entry(store).State); // Unchanged ctx.SaveChanges();