实体框架中的FirstOrDefault调用是被缓存的,但数据库已经被更改。

7

我遇到了一个奇怪的问题,这是我以前从未遇到过的。我使用Entity Framework来检索我的记录。

我有以下调用:

 var dbOrganisation = repository.DbOrganisation.FirstOrDefault(c => c.Id == id);

我希望此调用不要进行缓存。因此,当我进行此调用时,我期望它会查询数据库并检索最新的DbOrganisation对象。但实际情况并非如此。

我在相对较短的时间内(约5-10秒)连续两次调用此方法。但是在这段时间内,此表中的小数值可能会被第三方更改。

然而,即使该值发生了更改,FirstOrDefault调用也仍会检索未更新的版本。

示例情况

  1. 我进行FirstOrDefault调用,并查看字段Credits的小数值为50
  2. 第三方将Credits更改为45
  3. 10秒后,我再次进行FirstOrDefault调用,但DbOrganisation中仍然具有50个积分

我做错了什么?我以为默认情况下FirstOrDefault调用不会被缓存?
1个回答

9

您做的一切都是正确的,这就是EF的工作方式。

您可以使用 .AsNoTracking() 来达成您的目的:

var dbOrganisation = repository.DbOrganisation.AsNoTracking().FirstOrDefault(c => c.Id == id);

DbExtensions.AsNoTracking方法:返回一个新查询,其中返回的实体将不会被缓存在DbContext或ObjectContext中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接