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

