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

EF Core中SaveChanges前如何查询已添加未提交的WorkEffortTypeXref数据

解决方案

核心原因

EF 默认执行LINQ to Entities查询时会直接将查询语句发送到数据库执行,你调用Add/AddRange添加到DbSet但未执行SaveChanges的实体仅保存在上下文的本地跟踪缓存中,不会被数据库查询返回,因此默认查询不到未提交的新增数据。

最优实现方案

该方案完全不需要提前调用SaveChanges,不会破坏你的事务性要求:你可以直接使用DbSet<T>.Local属性读取上下文跟踪的所有未提交实体,这个属性返回的是内存中的可观测集合,包含所有你刚添加还没保存的WorkEffortTypeXref实例。

如果你只需要查询本次新增的未提交数据

直接将LINQ语句中的WorkEffortTypeXref替换为_clDBContext.WorkEffortTypeXref.Local即可:

var linqquery = from bupr in BusProc
                join wrtx in _clDBContext.WorkEffortTypeXref.Local 
                on bupr.BusProcId equals wrtx.SourceDataEntityTypeId
                // where wrtx.SourceDataEntityTypeName == "BusProc"
                select new
                {
                    wrtx.TargetDataEntityTypeId
                };

如果你需要同时查询数据库已存在的+本次新增未提交的数据

先把数据库中需要的WorkEffortTypeXref数据加载到上下文本地缓存,再查询Local属性即可,数据会自动合并:

// 先将数据库中符合过滤条件的数据加载到本地缓存,可按需加Where条件缩小加载范围
_clDBContext.WorkEffortTypeXref.Where(x => x.SourceDataEntityTypeName == "BusProc").Load();

// 此时Local包含数据库已有+本次新增的所有符合条件的数据
var linqquery = from bupr in BusProc
                join wrtx in _clDBContext.WorkEffortTypeXref.Local 
                on bupr.BusProcId equals wrtx.SourceDataEntityTypeId
                select new
                {
                    wrtx.TargetDataEntityTypeId
                };

额外注意事项

  • 如果你需要排除本地缓存中标记为删除的实体,可以加额外过滤:
    var validLocalXrefs = _clDBContext.WorkEffortTypeXref.Local
        .Where(x => _clDBContext.Entry(x).State != EntityState.Deleted);
    
  • 原代码中添加单个实体时用Add方法即可,不需要调用接收集合参数的AddRange,可简化为:
    _clDBContext.WorkEffortTypeXref.Add(WorkEffortTypeXref);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:48:04