• 在FreeSQL中实现「触发器」和软删除功能


    前言#

    最近做新项目,技术栈 AspNetCore + FreeSQL

    这个ORM真的好用,文档也很完善,这里记录一下两个有关「触发器」的功能实现

    修改实体时记录更新时间#

    模型代码

    我的模型都是基于这个 ModelBase 派生的,自带三个属性字段

    public abstract class ModelBase : ISoftDelete {
        public DateTime CreatedTime { get; set; } = DateTime.Now;
        public DateTime ModifiedTime { get; set; } = DateTime.Now;
        public bool IsDeleted { get; set; } = false;
    }
    

    现在要实现修改每个实体的时候自动更新 ModifiedTime 字段

    可以使用 FreeSQL 提供的 AOP 里的「审计属性值」功能

    按照官方的介绍:该功能可以实现插入/更新时统一处理某些值,比如某属性的雪花算法值、创建时间值、甚至是业务值。

    创建FreeSQL实例的时候配置一下

    检查实体类型,如果是 ModelBase 类型的话,那么把 ModifiedTime 字段设置为当前修改的时间

    // 实体变化事件监听
    freeSql.Aop.AuditValue += (sender, args) => {
        if (args.Object is ModelBase modelBase) {
            modelBase.ModifiedTime = DateTime.Now;
        }
    };
    

    除此之外,还有一个功能是监控实体修改的,我一开始用的这个,但是发现它是在实体已经修改保存完才执行,无法实现记录更新时间的功能。不过这个用来审计是比较有用的,记录一下~

    fsql.Aop.CurdAfter += (s, e) => {
        Console.WriteLine($"ManagedThreadId:{Thread.CurrentThread.ManagedThreadId};"+
        $" FullName:{e.EntityType.FullName} ElapsedMilliseconds:{e.ElapsedMilliseconds}ms, {e.Sql}");
    };
    

    实现软删除#

    现在的设计为了提高容错性都是做软删除,这样误删之后还能恢复数据。

    我之前封装的 DjangoStarter 框架是自己实现了软删除(通过重写 DjangoORM 的 objects 管理器实现)

    来到 FreeSQL 这里,根据官方文档,可以直接使用过滤器功能实现软删除。

    先定义一个接口

    public interface ISoftDelete {
        bool IsDeleted { get; set; }
    }
    

    其实用我上面的 ModelBase 也行

    不过我看官方文档这么用了,也就跟着写~ (接口的泛用性更高,可能有些实体是不需要创建时间和修改时间字段的)

    然后在创建FreeSQL实例的时候配置一下

    freeSql.GlobalFilter.Apply("IsDeleted", a => a.IsDeleted == false);
    

    这样读取数据的时候,IsDeleted 字段为 true 的项目就自动过滤掉了

    删除的时候不要直接执行 repo.Delete ,而是把 IsDeleted 字段设置为 true

    当然也可以像上面的 AOP 一样,把所有删除操作拦截下来。

    参考资料#

  • 相关阅读:
    交互与前端3 前端需求简单梳理
    xxl-job默认accessToken命令执行漏洞复现
    玄幻小说阵法大全—— 网文助手
    Python列表元组字典集合存储结构
    全球创业浪潮:跨境电商的创新时代
    利用iframe实现局部打印(区域打印)
    机器学习之scikit-learn基础教程
    Java Azure开发 使用已有token字符串创建GraphServiceClient
    逻辑漏洞挖掘之XSS漏洞原理分析及实战演练 | 京东物流技术团队
    Java Math.acos()方法具有什么功能呢?
  • 原文地址:https://www.cnblogs.com/deali/p/16843720.html