前言

最近做新项目,技术栈 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中实现「触发器」和软删除功能的更多相关文章

  1. 在Mac中使用「dd」指令烧录ISO镜像文件到U盘

    作者:超級efly   發布:2014-07-26 20:22   分類:電腦   閱讀:442   11條評論    大家在Windows系統下可以方便的使用UltraISO程式來燒錄「.ISO」, ...

  2. nc - 网络工具箱中的「瑞士军刀」

    nc 是 Linux下强大的网络命令行工具,主要用于 TCP.UDP.UNIX域套接字 相关的操作 它被设计成可以由其他程序灵活驱动可靠的后台工具,拥有 "瑞士军刀" 的美称,每个 ...

  3. Facebook 发布「流程」

    时不时就会在面试过程中碰到有候选人问 Facebook 是否采用 Scrum 之类的敏捷方法,偶尔也会有中国的朋友问及 Facebook 上线流程.我通常会简单说几句,然后说「如果你真感兴趣的话,去搜 ...

  4. 「技巧」如何快速安装 Sketch 插件

    Sketch拥有强大丰富的插件,但是这些插件天各一方,四处查找下载地址非常麻烦.这里提供一个技巧,通过一个入口可以安装各种插件,基本涵盖了市面上所有靠谱的插件. 准备 Sketch54 Runner ...

  5. spring cloud 入门,看一个微服务框架的「五脏六腑」

    Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 注:Spring Boot 简单理解就是简化 Spring 项目的搭建.配置.组 ...

  6. 从 Spring Cloud 看一个微服务框架的「五脏六腑」

    原文:https://webfe.kujiale.com/spring-could-heart/ Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构 ...

  7. Linux 小知识翻译 - 「BitTorrent」

    这次聊聊「BitTorrent」. (也就是下片子的 BT) BitTorrent是文件传输的一种.它可以在服务端负担很小的情况下高速的传输文件. BitTorrent最大的特点就是服务端可以将文件的 ...

  8. Linux 小知识翻译 - 「别名」

    实际上,「别名」被用在多种场合下.比如「命令的别名」,「邮件地址的别名」等等. 所以,单独说「别名」的时候,根据不用的场合,代表的意思也不一样. 一般来说,「别名」是指意思差不多的东西. 「别名」的英 ...

  9. Linux 小知识翻译 - 「分区」

    安装Linux的时候,需要对硬盘进行分区.那么「分区」到底是什么呢? 「分区」在日语中有区分,分割的意思.计算机术语中有时会说「对一个磁盘进行分区」,整个意思就是指定如何分割磁盘的意思. 「对磁盘进行 ...

随机推荐

  1. HCIA-datacom 4.2 实验二:本地AAA配置实验

    关于本实验 AAA是Authentication(认证).Authorization(授权)和Accounting(计费)的简称,是网络安全的一种管理机制,提供了认证.授权.计费三种安全功能.这三种安 ...

  2. PHP随机图片API

    相比上一个版本代码缩短了 此版本为图片专用 查看代码 <?php $img=file('img.txt');//txt文件 $url=array_rand($img);//imgtxt文档里面图 ...

  3. VS2017Enterprise版本安装ImageWatch 2017问题解决

    按照Andrei给的方法并不一定能成功. 方法如下: 1. Download the extension (ImageWatch.vsix) and open it using WinRAR 2. F ...

  4. django_day04

    django_day04 路由 from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图,参数,别名), ] 正则表达式 ...

  5. for--else大坑问题

    这是一次偶然发现的问题,做一下记录 a = [{'w0', 'b0', 'v0'}, {'w1', 'b1', 'v1'}, {'w2', 'b2', 'v2'}] for i in a: for j ...

  6. 开发个RTMP播放器居然这么难?RTMP播放器对标和考察指标

    好多开发者提到,RTMP播放器,不知道有哪些对标和考察指标,以下大概聊聊我们的一点经验,感兴趣的,可以关注 github: 1. 低延迟:大多数RTMP的播放都面向直播场景,如果延迟过大,严重影响体验 ...

  7. Ansible_基础模块

    特点:无主从,即装即用,基于ssh 安装ansible yum install epel-release -y yum install ansible -y 定义主机清单 vim /etc/ansib ...

  8. 进阶:spring-bean生命周期流程

    Bean的生成过程 主要流程图 1. 生成BeanDefinition Spring启动的时候会进行扫描,会先调用org.springframework.context.annotation.Clas ...

  9. Mybatis框架搭建

    Mybatis框架搭建 思路: 搭建环境 导入Mybatis 编写代码 测试 一.搭建环境 创建数据库 /* Navicat Premium Data Transfer​ Source Server ...

  10. 使用SkyWalking监控nginx (以openresty为例)

    安装使用SkyWalking先看这篇文章,地址:https://www.cnblogs.com/sanduzxcvbnm/p/15829781.html 使用SkyWalking监控nginx借助的是 ...