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

EF Core DbContext全局过滤器动态切换后关联实体缓存异常问题

EF Core DbContext全局查询过滤器切换ID后缓存异常问题

问题描述

使用EF Core时,通过RegistrationRoundIdProvider切换环境上下文的RegistrationRoundId属性(该属性用于DbContext的全局查询过滤器),出现缓存异常:先查询依赖该属性的嵌套对象,切换RegistrationRoundId后再次执行相同查询,嵌套实体被错误缓存,导致新查询结果中混入旧ID关联的实体数据。

已尝试将RegistrationRoundId声明为DbContext属性并遵循EF Core规范,但问题未解决。仅在以下两种临时场景下问题消失:

  • 使用AsNoTracking()扩展方法
  • 在不同作用域中执行查询(推测每个作用域会创建新的DbContext实例)

需要专业的根本性解决方案,而非手动重复的临时处理办法。

问题代码片段

// 当前RegistrationRoundId为id1
r = lst.Select(e => (object)new
{
    e.Id,
    e.StudyYearId,
    countRequest = e.Requests.Count,
    // 此处仅包含id1关联的requests
    requests = e.Requests.Select(e => e.RegistrationRoundId).ToList()
})
.FirstOrDefault();

// 切换RegistrationRoundId为id2
using (_currentRegistrationRound.Change(rs[1].Id))
{
    r1 = (await qryM.ToListAsync())
    .Select(e => (object)new
    {
        e.Id,
        e.StudyYearId,
        countRequest = e.Requests.Count,
        // 此处同时包含id1和id2关联的requests
        requests = e.Requests.Select(e => e.RegistrationRoundId).ToList()
    })
    .FirstOrDefault();
}

// 切换RegistrationRoundId为id3(新Guid,无对应requests)
using (_currentRegistrationRound.Change(Guid.NewGuid()))
{
    r2 = (await qryM.ToListAsync())
    .Select(e => (object)new
    {
        e.Id,
        e.StudyYearId,
        countRequest = e.Requests.Count,
        // 此处无id3关联的requests,但仍包含id1和id2的requests
        requests = e.Requests.Select(e => e.RegistrationRoundId).ToList()
    })
    .FirstOrDefault();
}

更新信息

已在DbContext中使用简单的依赖属性:

public Guid RegistrationRoundId {get; set;}

测试后仍出现相同错误结果:切换到新RegistrationRoundId后,查询结果依旧混入旧ID的关联数据,即使新ID无对应数据时,旧数据仍存在。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:07:40