实体框架AutoDetectChangesEnabled = false和. find
本文关键字:find false 框架 AutoDetectChangesEnabled 实体 | 更新日期: 2023-09-27 18:01:42
最近我在EF中发现了AutoDetectChangesEnabled选项,并且在官方文档中指出手动处理AutoDetectChangesEnabled可能会导致"微妙的错误"。
正如我所理解的,当保存更改的实体到数据库时,事情可能会出错,所以我的问题是:这段代码安全吗(默认情况下,实体框架在调用Find时自动执行检测更改):
using (var context = new DbContext())
{
context.Configuration.AutoDetectChangesEnabled = false;
var user = context.users.Find(id);
context.Configuration.AutoDetectChangesEnabled = true;
return user;
}
所以,正如你所看到的,我没有对我的实体做任何改变,只是返回它们,如果AutoDetectChangesEnabled设置为false, Find仍然会先命中缓存,然后数据库?
禁用AutoDetectChangesEnabled
不是问题,您只是禁用了一个功能。实体框架不会跟踪你的实体的变化,你必须在SaveChanges
之前手动标记它们。
激活和停用它的方式是没有意义的,因为你是在using块中创建上下文。这意味着在你使用它之后,你在处理它。因此,您不需要再次激活它。
另一方面,您可以在从数据库获取对象时使用AsNoTracking()
,而不是停用更改检测。这将加快您的查询速度,但您仍然可以对其他实体使用变更检测功能。就像这样:
dbContext.Users.AsNoTracking().ToList();