当前位置: 首页 > 面试题库 >

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

昝唯
2023-03-14
问题内容

我有一个奇怪的问题,这是我以前从未经历过的。我使用实体框架检索我的记录。

我有以下电话:

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

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

我称此方法为相距相对较短时间的相对两倍(约5-10秒)。但是在此期间,该表中的十进制值可以由某些第三方更改。

但是,即使值更改,该FirstOrDefault调用也会检索未更新的版本。

情况示例

  1. FirstOrDefault拨打电话,看到该字段的十进制值为Credits50
  2. 第三方将更Credits改为45
  3. 我在FirstOrDefault10秒钟后拨打了电话,但DbOrganisation仍然有50积分

我究竟做错了什么?我以为FirstOrDefault默认情况下未缓存该呼叫?


问题答案:

您做的所有事情都是正确的,这就是EF的工作原理。

您可以使用.AsNoTracking()以下目的:

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

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



 类似资料:
  • 防止在ASP.NET MVC中对使用属性的特定操作进行缓存 ASP.NET MVC如何禁用自动缓存选项?

  • 我有一个带有“Status”布尔值的付款模型,该布尔值默认为false。付款后,我需要将特定付款的“状态”更新为true。 这是我一直试图用来更改特定数据库条目的代码,但它并没有改变它。我做错了什么? 谢谢 这就是最终起作用的原因:

  • 使用Java和Spring,我有一个被修改但尚未持久化的实体。我想把它和它的原始状态,数据库中仍然存在的状态进行比较。但是,当我为实体执行获取以获得旧状态时,它总是返回修改状态的实体。 为了更好地说明这一点,下面给出了一个例子。 null 从存储库中提取并与进行比较。但是,当这样做时,始终与相同。(中更改的值反映在中。) 由于尚未保存,我如何获取实体的状态,因为它当前存在于数据库中而不是当前上下文

  • 我曾想过简单地对数据库运行一个小命令并捕获任何异常,然而,如果出现问题(例如app.config丢失或数据库服务器关闭),应用程序将花费大量时间运行此代码,然后抛出异常(大约1分钟)。我想这是由于连接超时等,但我已经摆弄了这样的属性没有任何作用。 有没有人能提供任何关于去哪里的建议?

  • 问题内容: 在这些多重性冲突中,我所看到的大多数其他问题都是代码优先的,而我将DB作为第一位。我进行了一些模式更改,并且从数据库刷新模型时出现以下错误: 多重性与关系“ FK_MarketSelectionWager_Bet”中的角色“赌注”中的引用约束冲突。由于从属角色中的所有属性都是不可为空的,因此,主体角色的多重性必须为“ 1”。 我需要在SQL或模型中进行修复的任何指针都很棒。 以下是涉及