ASP.NET Core 6 MVC中数据模型重复保留前次SQL查询结果的问题
问题分析与解决
首先你代码里有个明显笔误:GetSecondDataSet方法里的Set<DataSetModel_Model>()要改成Set<DataSet_Model>(),先修正这个基础错误。
核心问题出在EF Core的变更跟踪机制:两次查询共用同一个DbContext实例时,EF会自动缓存查询到的实体。如果两组数据里存在主键值相同的实体,EF不会用第二次查询的新数据覆盖缓存,而是直接返回第一次的实例,这就导致DataSetTwo混入了DataSetOne的数据。
以下是几种可行的解决办法:
方法1:禁用查询跟踪(推荐)
在两个查询方法中添加AsNoTracking(),让EF不跟踪这些实体,每次查询都会返回全新的实例,彻底避免缓存干扰:
public virtual async Task<List<DataSet_Model>> GetFirstDataSet() => await Set<DataSet_Model>() .FromSqlInterpolated($"EXEC dbo.GetFirstDataSet") .AsNoTracking() .ToListAsync(); public virtual async Task<List<DataSet_Model>> GetSecondDataSet() => await Set<DataSet_Model>() .FromSqlInterpolated($"EXEC dbo.GetSecondDataSet") .AsNoTracking() .ToListAsync();
方法2:手动清空上下文跟踪
获取完第一组数据后,清空DbContext的变更跟踪器,让它忘记之前的实体:
public async Task<Container_Model> GetDataSets() { Container_Model model = new Container_Model(); model.DataSetOne = await _context.GetFirstDataSet(); _context.ChangeTracker.Clear(); // 清空已跟踪的实体 model.DataSetTwo = await _context.GetSecondDataSet(); return model; }
额外检查点
确认DataSet_Model正确配置了主键(比如添加[Key]属性),如果实体没有主键,EF的跟踪逻辑会混乱,也可能引发这类数据混叠问题。
内容的提问来源于stack exchange,提问作者bmurrell30
相关产品推荐
相关产品推荐

