在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<ISoftDelete>("IsDeleted", a => a.IsDeleted == false);
这样读取数据的时候,IsDeleted 字段为 true 的项目就自动过滤掉了
删除的时候不要直接执行 repo.Delete ,而是把 IsDeleted 字段设置为 true
当然也可以像上面的 AOP 一样,把所有删除操作拦截下来。
参考资料
- FreeSQL文档 - AOP - https://freesql.net/guide/aop.html
- FreeSQL文档 - 过滤器 - https://freesql.net/guide/filters.html
在FreeSQL中实现「触发器」和软删除功能的更多相关文章
- 在Mac中使用「dd」指令烧录ISO镜像文件到U盘
作者:超級efly 發布:2014-07-26 20:22 分類:電腦 閱讀:442 11條評論 大家在Windows系統下可以方便的使用UltraISO程式來燒錄「.ISO」, ...
- nc - 网络工具箱中的「瑞士军刀」
nc 是 Linux下强大的网络命令行工具,主要用于 TCP.UDP.UNIX域套接字 相关的操作 它被设计成可以由其他程序灵活驱动可靠的后台工具,拥有 "瑞士军刀" 的美称,每个 ...
- Facebook 发布「流程」
时不时就会在面试过程中碰到有候选人问 Facebook 是否采用 Scrum 之类的敏捷方法,偶尔也会有中国的朋友问及 Facebook 上线流程.我通常会简单说几句,然后说「如果你真感兴趣的话,去搜 ...
- 「技巧」如何快速安装 Sketch 插件
Sketch拥有强大丰富的插件,但是这些插件天各一方,四处查找下载地址非常麻烦.这里提供一个技巧,通过一个入口可以安装各种插件,基本涵盖了市面上所有靠谱的插件. 准备 Sketch54 Runner ...
- spring cloud 入门,看一个微服务框架的「五脏六腑」
Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 注:Spring Boot 简单理解就是简化 Spring 项目的搭建.配置.组 ...
- 从 Spring Cloud 看一个微服务框架的「五脏六腑」
原文:https://webfe.kujiale.com/spring-could-heart/ Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构 ...
- Linux 小知识翻译 - 「BitTorrent」
这次聊聊「BitTorrent」. (也就是下片子的 BT) BitTorrent是文件传输的一种.它可以在服务端负担很小的情况下高速的传输文件. BitTorrent最大的特点就是服务端可以将文件的 ...
- Linux 小知识翻译 - 「别名」
实际上,「别名」被用在多种场合下.比如「命令的别名」,「邮件地址的别名」等等. 所以,单独说「别名」的时候,根据不用的场合,代表的意思也不一样. 一般来说,「别名」是指意思差不多的东西. 「别名」的英 ...
- Linux 小知识翻译 - 「分区」
安装Linux的时候,需要对硬盘进行分区.那么「分区」到底是什么呢? 「分区」在日语中有区分,分割的意思.计算机术语中有时会说「对一个磁盘进行分区」,整个意思就是指定如何分割磁盘的意思. 「对磁盘进行 ...
随机推荐
- thinkphp 5 及一下或php项目里实现模糊查询
想在thinkPHP或者PHP项目实现模糊查询怎么实现呢? 今天在网上搜了一下用 mysql里的 like 就可以实现 怎么用呢? 看代码: 错误用法: where('title','like',$s ...
- HTTP/3,它来了
HTTP 3.0 是 HTTP 协议的第三个主要版本,前两个分别是 HTTP 1.0 和 HTTP 2.0 ,但其实 HTTP 1.1 我认为才是真正的 HTTP 1.0. 如果你对 HTTP 1.1 ...
- iommu系列之---概念解释篇
本文会对iommu中的一些容易引起疑惑的概念进行阐述,内核版本为4.19. 先上简写: DMAR - DMA remapping DRHD - DMA Remapping Hardware Unit ...
- Mysql 一主一从
1. 主从原理 1.1 主从介绍 所谓 mysql 主从就是建立两个完全一样的数据库,其中一个为主要使用的数据库,另一个为次要的数据库,一般在企业中,存放比较重要的数据的数据库服务器需要配置主从,这样 ...
- [CF1481D] AB Graph(构造)
题解 给一个 n \tt n n 个点的完全有向图, ( u , v ) \tt(u,v) (u,v) 或者 ( v , u ) \tt(v,u) (v,u) 都有一条边,前提是 u ≠ v \tt ...
- 【java】学习路径25-ArrayList类,Vector类,LinkedList类的使用和区别,Iterator迭代器的使用
ArrayList的使用 ArrayList类:可变化长度的数组. 与一般的数组不同的是,其长度不固定,可以添加任意类型的数据. 也可以添加不同类型的数据,但是一般不这么做. ArrayList类位于 ...
- Java使用定时任务详解
定时任务 目录 定时任务 SpringBoot定时任务 默认单线程 使用异步多线程 Spring定时任务XML配置(注解形式几乎同上) 使用springTask: ----springTask为spr ...
- IdentityServer4登录后无法跳转设置策略
在中间件中手动改变samesite属性为lax就可以解决问题: services.Configure<CookiePolicyOptions>(options => { option ...
- 字符类数据类型和oracle字符类型的区别
为兼容Oracle的数据类型,KingbaseES扩展了Oracle的NUMBER.VARCHAR2.CHAR(n)和DATE类型.该措施使得移植Oracle的Create Table等DDL语句时, ...
- Markdown Support
Markdown 支持一览 Markdown 支持一览 身正不怕影子斜 我实在没有说过这样一句话 -- 鲁迅 古代文学史发展脉络 唐诗 宋词 元曲 冯·诺依曼结构 运算器 控制器 存储器 输入输出设备 ...