You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor应用中EF Core 8 DbContext无法加载其他应用修改的新数据

解决EF Core上下文缓存导致的Blazor数据刷新问题

强制从数据库获取最新数据的方法

  • 使用AsNoTracking():让EF Core跳过实体跟踪逻辑,直接从数据库读取最新数据,完全不使用上下文缓存。示例代码:
    _context.Line.AsNoTracking().Where(i => i.id == id)
    
  • 重新创建DbContext实例:DbContext的一级缓存是实例级别的,每次查询时使用全新的上下文实例,就能彻底避开旧缓存的干扰。在Blazor中可以通过IDbContextFactory<YourDbContext>创建新实例,替代长期复用的上下文对象。
  • 单实体强制刷新:如果已经获取了特定实体实例,可通过Reload()方法单独刷新它的状态:
    var targetEntity = _context.Line.FirstOrDefault(i => i.id == targetId);
    if (targetEntity != null)
    {
        _context.Entry(targetEntity).Reload();
    }
    

为什么不同查询结果有差异?

这是EF Core**一级缓存(上下文缓存)**的特性导致的:

  • 当你第一次执行全量查询_context.Line.Where(i => i.id == id)时,所有符合条件的实体都会被加载到当前DbContext的缓存中。后续再执行相同查询时,EF会直接返回缓存里的旧数据,不会主动去数据库同步最新状态。
  • 执行Where(s => s.state != State.Recorded)时,那些被其他应用修改为Recorded的实体,在第一次查询时因为状态是New,并没有被包含在该查询结果里,也就没进入缓存。后续查询时,EF需要去数据库筛选符合条件的实体,自然能拿到最新的状态。
  • 而Where(s => s.state != State.Flag)的查询,那些被修改的实体(原New变为Recorded)已经在之前的全量查询中被加载到缓存里了,EF会直接从缓存返回这些实体的旧状态,不会触发新的数据库查询。

内容的提问来源于stack exchange,提问作者zawisza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 19:30:02