在FreeSQL中实现「触发器」和软删除功能
前言 最近做新项目,技术栈 AspNetCore + FreeSQL 这个ORM真的好用,文档也很完善,这里记录一下两个有关「触发器」的功能实现 修改实体时记录更新时间 模型代码 我的模型都是基于这个 ModelBase 派生的,自带三个属性字段 public abstract class ModelBase : ISoftDelete { public DateTime CreatedT
目录4 个章节
前言
最近做新项目,技术栈 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
_EOF_
在FreeSQL中实现「触发器」和软删除功能
- 本文作者:
- 程序设计实验室
- 版权声明:
- 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章
没有学会正确审视自己,不能说是真正的成长
前言 某一天在洗澡的时候,我突然思考起来,最近几年,最大的收获是什么? 从专业技术知识想到了为人处世,想来想去,觉得最大的收获,大概就是终于初步学会审视自己了。 学会批判自己 批判别人不算本事,因为我们总是可以很容易的找出别人的缺点,就算他真的做的很完美无可挑剔了,还是能够从鸡蛋里挑骨头,然而反过来批判自己却不是每个人都能做得到的,认识到自己的错误是很难的一件事情,更何况是正确地审视自己。 曾子曰
2022-11-07 · 2017 · 约 1 分钟
使用GTD工作法提升效率
GTD 即 Getting Things Done (儘管去做) 的首字母縮寫字,這是一種由 David Allen 在 2001 年首次提出的生產力方法。Allen 在其書中這樣描述 GTD 法:「儘管去做:毫無壓力的生產力藝術。」
2025-01-13 · 2025 · 约 1 分钟
告别单调,Django后台主页改造
前言 之前我做了个Django的项目,为了让管理后台更加美观,我对Django(应该说是SimpleUI的)默认的Admin后台主页进行改造,具体可以看这篇文章:项目完成 - 基于Django3.x版本 - 开发部署小结 之前的两篇关于Django3.x开发部署小结的文章介绍的都是数据库、接口、性能方面的,看到有朋友留言对后台主页的改造表示有兴趣,所以就写一篇来介绍一下~ 分析 改造基于我定制的
2022-06-28 · Django · 约 1 分钟
GitLab的安装、配置、使用
前言 上周去参与“中国数字经济创新发展大会”了,然后又忙新项目的事情,博客又有一段时间没有更新,今天周一事情比较少,立刻开始写文,最近有挺多值得记录的东西~ 进入正文,最近我们搭了个Gitlab,并且把正在开发的项目代码都迁移到自建的Gitlab上,整个过程还是比较流畅的~~(就是有点费内存~~ PS:立即下单给这台服务器买了四条16G内存组四通道~ 在此之前,我们团队一直使用Gitee企业版作为
2022-07-21 · DevOps · 约 1 分钟
讨论
共 0 条加载评论中…