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

