一个分表更新实体特定字段的bug 返回
项目基于.net8.0
调用链路
| 1 | 类定义(简略) [SplitTable(SplitType._Custom01, typeof(YyyyMMTableSplitService))] [SugarTable("o_patientregist_{yyyyMM}")] O_PatientRegist{ [SugarColumn(IsPrimaryKey = true, ColumnDescription = "主键", IsIdentity = false)] public virtual long Id { get; set; } [SplitField] [SugarColumn(ColumnDescription = "创建日期")] public DateTime CreateDate { get; set; } = DateTime.Now;
更新操作 await Appsettings.GetRequiredService<IO_PatientRegistRepository>().UpdateAsync(new O_PatientRegist() { Id =1 }, i => new { i.PharmacyID, i.PharmacyName, i.PharmacyCode, }); |
| 2 | 仓储接口实现 public virtual async Task<bool> UpdateAsync(T entity, Expression<Func<T, object>> columns) { var ret = await Db.Updateable<T>(entity).UpdateColumns(columns).SplitTable(FilterSplitTableByNames).ExecuteCommandAsync(); return ret > 0; } 根据实体对所有分表进行筛选的方 public IEnumerable<SplitTableInfo> FilterSplitTableByNames(List<SplitTableInfo> inputList) { // 处理输入为空的情况 if (inputList == null || inputList.Count == 0) return Enumerable.Empty<SplitTableInfo>(); // 处理全局表名列表为空的情况(提前返回避免无效查询) if (tableNames == null || tableNames.Count == 0) return inputList; // 将全局表名列表转换为 HashSet(提升 Contains 效率,自动去重) var targetNames = new HashSet<string>(tableNames, StringComparer.Ordinal); // 区分大小写 // 过滤逻辑:排除 null 元素,并检查 TableName 是否在目标集合中 return inputList.Where(sti => sti != null && targetNames.Contains(sti.TableName)); } |
| 3 | 结果是 在5.1.4.200的nuget库中,更新操作最终会在where中正确添加Id=1的条件 UPDATE `o_chatdetail_202603` SET `isread`='1' WHERE Id in (4610728417149391) 在5.1.4.211的开源版本中,实际的sql会缺少主键的where条件 UPDATE `o_patientregist_202603` SET `pharmacyid`='0',`pharmacyname`='',`pharmacycode`='' |
热忱回答(1)
-
VIP0
1周前版本问题,重拉最新版本的开源代码解决了
0 回复