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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 03:15:13