C# 实体框架AutoDetectChangesEnabled=false和.Find
最近,我在EF中发现了关于选项AutoDetectChangesEnabled的信息,在官方文档中指出,手动处理AutoDetectChangesEnabled可能会导致“微妙的错误” 据我所知,将更改的实体保存到数据库时可能会出错,所以我的问题是:这段代码是否安全(默认情况下,实体框架在调用Find时自动执行检测更改):C# 实体框架AutoDetectChangesEnabled=false和.Find,c#,entity-framework,C#,Entity Framework,最近,我在EF中发现了关于选项AutoDetectChangesEnabled的信息,在官方文档中指出,手动处理AutoDetectChangesEnabled可能会导致“微妙的错误” 据我所知,将更改的实体保存到数据库时可能会出错,所以我的问题是:这段代码是否安全(默认情况下,实体框架在调用Find时自动执行检测更改): 所以,正如您所看到的,我没有对我的实体进行任何更改,只是返回它们,如果AutoDetectChangesEnabled设置为false,则仍会首先命中缓存,然后命中数据库?禁
所以,正如您所看到的,我没有对我的实体进行任何更改,只是返回它们,如果AutoDetectChangesEnabled设置为false,则仍会首先命中缓存,然后命中数据库?禁用
AutoDetectChangesEnabled
不是问题,您只是禁用了一个功能。实体框架不会跟踪实体中的更改,您必须在SaveChanges
之前手动标记它们
以这种方式激活和停用它是没有意义的,因为您正在使用块中创建上下文。这意味着在你使用它之后,你就是在处理它。因此,您不需要再次激活它
另一方面,当您从数据库获取对象时,可以使用AsNoTracking()
,而不是停用更改检测。这将加快查询速度,但您仍然可以为其他实体提供更改检测功能。是这样的:
dbContext.Users.AsNoTracking().ToList();
本质上,
AsNoTracking()
告诉实体框架,“我不会更改EF缓存中的任何实体,所以不要添加跟踪信息。”如果您不打算修改检索的实体,它将消除一些额外的内存和处理。
dbContext.Users.AsNoTracking().ToList();