前言

最近做新项目,技术栈 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. 【Go实战基础】创建并完成第一个可执行的 go 程序

    实战需求:创建并完成第一个可执行的 go 程序.项目目录:go-001具体实战步骤如下: 一.进入工程目录 cd go-001/ 二. 创建 g001.go 文件 /* * @Author: 菜鸟实战 ...

  2. 【Go实战基础】GO语言是什么,有哪些优势

    一.简介 2007年,为了提高在多核.网络机器(networked machines).大型代码库(codebases)的业务场景下的开发效率,Google 首席软件工程师决定创造一种语言那就是 Go ...

  3. 微软Azure配置中心 App Configuration (二):Feature Flag 功能开关特性

    写在前面 Web服务开发过程中我们经常有这样的需求: 某些功能我必须我修改了配置才启用,比如新用户注册送券等: 某个功能需到特定的时间才启用,过后就失效,比如春节活动等: 某些功能,我想先对10%的用 ...

  4. React报错之You provided a `checked` prop to a form field

    正文从这开始~ 总览 当我们在多选框上设置了checked 属性,却没有onChange 处理函数时,会产生"You provided a checked prop to a form fi ...

  5. 模拟赛:树和森林(lct.cpp) (树形DP,换根DP好题)

    题面 题解 先解决第一个子问题吧,它才是难点 Subtask_1 我们可以先用一个简单的树形DP处理出每棵树内部的dis和,记为dp0[i], 然后再用一个换根的树形DP处理出每棵树内点 i 到树内每 ...

  6. 并发编程二、CPU多级缓存架构与MESI协议的诞生

    ​前言: 文章内容:线程与进程.线程生命周期.线程中断.线程常见问题总结 本文章内容来源于笔者学习笔记,内容可能与相关书籍内容重合 偏向于知识核心总结,非零基础学习文章,可用于知识的体系建立,核心内容 ...

  7. KingbaseES R6 通过脚本构建集群案例

      案例说明: KingbaseES V8R6部署一般可采用图形化方式快速部署,但在生产一线,有的服务器系统未启用图形化环境,所以对于KingbaseES V8R6的集群需采用手工字符界面方式部署,本 ...

  8. 002-ImageNetClassificationDeep2017

    ImageNet classification with deep convolutional neural networks #paper 1. paper-info 1.1 Metadata Au ...

  9. Windows Admin Center无法访问

    近日,有一台安装了Windows Admin Center的服务器无法访问了.遇到错误ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY.本以为这是更新了Chromium内 ...

  10. SpringBoot Xml转Json对象

    一.导入需要的依赖 <dependency> <groupId>maven</groupId> <artifactId>dom4j</artifa ...