前言最近做新项目 , 技术栈 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
推荐阅读
- 原神3.0秘宝迷踪第二天宝箱位置位置在哪
- why?would?i?ever?歌词中文翻译 whywouldiever歌词
- 中国标准的青年和中年的年龄段分别是多少 中国青年年龄
- iqoo8是双卡双待吗_iqoo8是不是双卡双待手机
- 中国说唱歌手排名 中国饶舌排名
- 长城上面的好汉碑在那 好汉碑在长城哪里
- 英雄联盟如何在游戏里回复好友(lol快速回复别人消息)
- 为什么CSS中的calc函数可能会不生效?
- Spring Cloud 整合 nacos 实现动态配置中心
- 原神秘宝迷踪第四天藏宝地4位置在哪