一个分表更新实体特定字段的bug 返回

SqlSugar 待处理
1 141
该叫什么 发布于1周前
悬赏:5 飞吻

项目基于.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 回复