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
相关产品推荐
相关产品推荐

