要专业系统地学习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();
View Code

相关文章:

  • 2021-10-30
  • 2022-02-09
  • 2019-01-19
  • 2021-09-02
  • 2021-10-06
  • 2021-10-15
  • 2021-05-08
  • 2021-12-04
猜你喜欢
  • 2019-02-18
  • 2019-01-30
  • 2021-08-05
  • 2021-06-04
  • 2021-10-14
  • 2021-10-02
  • 2022-01-09
相关资源
相似解决方案