C# EF中如何将列表未匹配数据库记录的当前行添加到DbSet
EF 列表与数据库同步逻辑的新增分支实现
else分支核心写法
当查询确认数据库无匹配记录时,直接将当前行数据添加到对应DbSet即可。如果遍历项x与dbLifeData对应的数据库实体类型完全一致,else块代码如下:
else { // 将新数据追加到对应DbSet _db.dbLifeData.Add(x); _db.SaveChanges(); }
注意:如果
x是前端传入的DTO/视图模型,和数据库实体类型不匹配,需要先手动映射为对应实体类再传入Add方法,示例:else { var newEntity = new LifeData { identifier = x.identifier, plan = x.plan, policyno = x.policyno, status = x.status // 其余字段按业务逻辑补全赋值 }; _db.dbLifeData.Add(newEntity); _db.SaveChanges(); }
现有代码可优化点
当前实现存在几处明显的性能和逻辑冗余问题,建议调整:
- 开头查询
objInsuredList的逻辑完全没有被后续代码使用,每次循环都执行一次全量匹配查询会产生不必要的数据库IO,直接删除即可 - 强烈不建议在每次循环内部调用
SaveChanges():每一次调用都会触发独立的数据库连接和事务提交,列表数据量大时性能损耗非常明显,可以把SaveChanges()挪到整个循环结束后统一执行,EF会自动跟踪所有新增/修改的实体状态,一次性提交所有变更 - 给已存在实体手动标记
EntityState.Modified的操作可以省略:你查询得到的query是被EF变更追踪器跟踪的实体,直接修改它的属性后,EF会自动将其标记为修改状态,不需要手动设置State属性
优化后完整参考代码
list.ForEach(x => { // 单次查询判断记录是否存在即可 var existingItem = _db.dbLifeData.FirstOrDefault(y => y.identifier == x.identifier && y.policyno == x.policyno && y.plan == x.plan); if(existingItem != null) { // 匹配到已有记录,更新状态字段 existingItem.status = x.status; } else { // 无匹配记录,追加新数据 // 若x与实体类型不匹配,替换为手动映射后的实体对象即可 _db.dbLifeData.Add(x); } }); // 循环结束后统一提交所有变更,执行效率更高 _db.SaveChanges();
内容的提问来源于stack exchange,提问作者Veck
相关产品推荐
相关产品推荐

