实体框架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 = false和. find

禁用AutoDetectChangesEnabled不是问题,您只是禁用了一个功能。实体框架不会跟踪你的实体的变化,你必须在SaveChanges之前手动标记它们。

激活和停用它的方式是没有意义的,因为你是在using块中创建上下文。这意味着在你使用它之后,你在处理它。因此,您不需要再次激活它。

另一方面,您可以在从数据库获取对象时使用AsNoTracking(),而不是停用更改检测。这将加快您的查询速度,但您仍然可以对其他实体使用变更检测功能。就像这样:

dbContext.Users.AsNoTracking().ToList();