软删除的Aop处理和改进建议 返回

SqlSugar 沟通中
41 612
该叫什么 fry 发布于1个月前
悬赏:0 飞吻

软删除的字段是IsDeleted,并且有删除时间和删除人,但是软删是更新,无法区分这个是编辑的修改还是软删除的修改,无法精准对删除时间和更新时间写入数据(删除人和更新人同理)

该功能属于软删和更新的区分,目前Aop区分不了(开启了Aop.DataExecuting区分并给审计字段赋值)


审计字段包含如下:

1:添加人,2:添加时间,3:修改人,4:修改时间,5:删除人,6:删除时间,7:IsDeleted

添加的时候 赋值 1和2

修改的时候 赋值 3和4

软删除的时候 赋值 5和6,7


现在区分不了修改和软删,导致 3,4,5,6这几个字段不能区分赋值

希望有办法改进一下


热忱回答41

  • fate sta fate sta VIP0
    1个月前

    可以反射 isdeleted 的值。如果是true就是假删除

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:Aop.DataExecuting 这个当修改的时候,事件类型已经确认了,且是每个列都要进入一次,区分不出来



    0 回复
  • fry fry VIP0
    1个月前

    ScreenShot_2025-11-06_164010_276.png@fate sta:这是修改的调试,区分不了,删除的时候也一样

    0 回复
  • fate sta fate sta VIP0
    1个月前

    image.png

    这个对象里面不是有值吗

    0 回复
  • fate sta fate sta VIP0
    1个月前

    isdeleted是true那么就是假删除

    0 回复
  • fate sta fate sta VIP0
    1个月前

    false就是更新

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:这个调试的是删除,按道理应该是True,因为软删也是更新

    0 回复
  • fate sta fate sta VIP0
    1个月前

    @fry:提供代码吧。不然说不清楚。按我的风要提供DEMO

    0 回复
  • fate sta fate sta VIP0
    1个月前

    写个DEMO也就3分钟时间。

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:这个目前应该做不了,软删除很难分辨,你那边也应该有demo,可以自己试试怎么区分软删除

    0 回复
  • fate sta fate sta VIP0
    1个月前

    @fry:不清楚你的需求有疑问提供具体DEMO和你具体效果。

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:这个先放一下,审计字段少一些就可以了,目前无法做到软删除和更新的区分

    0 回复
  • db.Aop.DataExecuting = (z,y) =>

    {

       if(逻辑)

        var value=y.EntityValue.GetType().GetProperty("删除字段").GetValue(y.EntityValue);

    };  


    0 回复
  • fate sta fate sta VIP0
    1个月前

    如果还说不可以区分必须提供DEMO。不然大家说的不在一个频道

    0 回复
  • fate sta fate sta VIP0
    1个月前

    一个DEMO就3分钟我不知道你为什么不写一个。 

    0 回复
  • fry fry VIP0
    1个月前

    @fate stay night:软删除的时候,sqlSugarProvider.Aop.DataExecuting = (obj, entityInfo) =>{


        //每个行的每个列都会进来一次,而且软删除标记IsDeleted=false,根本判断不出来是


     你这种   ------>  var value=y.EntityValue.GetType().GetProperty("删除字段").GetValue(y.EntityValue);    ---------->   y.EntityValue中的IsDeleted=false,区分不出来

        

    });


    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:我是用组件开发,从0开始搭建项目太麻烦

    0 回复
  • fate sta fate sta VIP0
    1个月前

    @fry:新建一个控制台。还需要什么搭建。

    0 回复
  • fate sta fate sta VIP0
    1个月前

    image.png

    新建一个控制台就行了。写一个DEMO最多3分钟

    0 回复
  • fate sta fate sta VIP0
    1个月前

    3秒入门DEMO.zip

    可以在我这个基础上改。

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:这个问题先放一放吧,之前给你提过这个需求,最好是和更新,添加一样,能用枚举来区分,现在用反射搞不是特别好

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:你没看到它是false吗?false是更新,true才是软删除  而且这个aop处理的是数据更改前的值,IsDeleted肯定都是false啊


    image.png

    0 回复
  • fate sta fate sta VIP0
    1个月前

    @fry:不能重现,你传的什么就是什么。

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:那就先这样

    0 回复
  • fate sta fate sta VIP0
    1个月前

    image.png

    0 回复
  • fate sta fate sta VIP0
    1个月前

    image.png

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:不是动态的更新了,是常规的更新(带条件的),我用的是这种,(软删除不用查了一遍再赋值

    image.png

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:即便能通过这种反射的方式能获取到值,也不会这样用,本生这个aop就是行事件,每个列都会进来一次,反射从性能上讲都说不过去,会有频繁的反射操作

    0 回复
  • fate sta fate sta VIP0
    1个月前

    表达式方式目 前只支持追加列。

    建议你改成实体方式。

    0 回复
  • fate sta fate sta VIP0
    1个月前

    用updateByObject实现

    0 回复
  • fate sta fate sta VIP0
    1个月前

    你这种我在想想。有没有其他方案在底层解决。明天给你答复

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:目前的审计字段删除人这些去掉了,暂时不影响,你考虑一下,毕竟软删除是十分常用的底层功能

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:我这边定义了基类聚合根,强类型,不是动态的类型了,动态的类型是另一个问题

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:有没有好的解决方案?

    0 回复
  • fate sta fate sta VIP0
    1个月前

    @fry:现在处理。。

    0 回复
  • fry fry VIP0
    1个月前

    @fate sta:好的,改好之后告知一下

    0 回复
  • fry fry VIP0
    2周前

    @fate sta:这个有解决方案吗?

    0 回复
  • 。周未处理。有点复杂

    0 回复
  • fry fry VIP0
    2周前

    @fate sta:有没有好的方案?

    0 回复
  • 尽快处理

    0 回复
  • fry fry VIP0
    2周前

    @fate sta:好的

    0 回复