在FreeSQL中实现「触发器」和软删除功能

freesql,实现,触发器,删除,功能 · 浏览次数 : 569

小编点评

## FreeSQL AOP 中的触发器功能实现 这篇文章介绍了在 FreeSQL 中实现实体修改时间记录的步骤以及一些配置选项。 **基本概念:** * FreeSQL 提供 AOP 功能,可以统一处理插入/更新时统一处理一些值,比如创建时间、修改时间、业务值等。 * 触发器是实现 AOP 功能的关键,它允许在实体修改时记录更新时间。 * 在实体修改时,可以使用 FreeSQL 的 `Aop.AuditValue` 属性来实现记录更新时间的功能。 **实现步骤:** 1. **配置 FreeSQL 实体类型:** 在创建 FreeSQL 实例时,配置 `FreeSql.GlobalFilter.Apply` 方法以筛选 `ISoftDelete` 接口的实体。 2. **实现 `Aop.AuditValue` 属性:** 在实体属性中设置 `CreatedTime` 和 `ModifiedTime` 字段,并将 `ModifiedTime` 设置为当前修改时间。 3. **记录修改时间:** 在实体修改事件监听器中,使用 `FreeSql.Aop.AuditValue` 属性记录修改时间。 4. **软删除设计:** 在软删除情况下,使用 `FreeSql.GlobalFilter.Apply` 筛选实体,并将 `IsDeleted` 字段设置为 `true`。这确保删除时不会执行真正删除操作,而只记录更新操作。 **示例代码:** ```csharp // 接口 public interface ISoftDelete { bool IsDeleted { get; set; } } // 模型基类 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; } // FreeSQL 实例配置 var freeSql = new FreeSql(); freeSql.GlobalFilter.Apply(entityType => entityType as ModelBase); ``` **参考资料:** * FreeSQL 文档 - AOP - https://freesql.net/guide/aop.html * FreeSQL 文档 - 过滤器 - https://freesql.net/guide/filters.html

正文

前言

最近做新项目,技术栈 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中实现「触发器」和软删除功能相似的内容:

在FreeSQL中实现「触发器」和软删除功能

前言 最近做新项目,技术栈 AspNetCore + FreeSQL 这个ORM真的好用,文档也很完善,这里记录一下两个有关「触发器」的功能实现 修改实体时记录更新时间 模型代码 我的模型都是基于这个 ModelBase 派生的,自带三个属性字段 public abstract class Mode

Asp-Net-Core开发笔记:快速在已有项目中引入EFCore

前言 很多项目一开始选型的时候没有选择EFCore,不过EFCore确实好用,也许由于种种原因后面还是需要用到,这时候引入EFCore也很方便。 本文以 StarBlog 为例,StarBlog 目前使用的 ORM 是 FreeSQL ,引入 EFCore 对我来说最大的好处是支持多个数据库,如果是

JAVA下唯一一款搞定OLTP+OLAP的强类型查询这就是最好用的ORM相见恨晚

JAVA下唯一一款搞定OLTP+OLAP的强类型查询这就是最好用的ORM相见恨晚 介绍 首先非常感谢 FreeSQL 提供的部分源码,让我借鉴了不少功能点,整体设计并没有参考FreeSQL(因为java压根没有expression所以没办法参考)只是在数据库方言上FreeSQL提供的SQL让我少走了

[转帖]生成并配置https本地证书

https://www.cnblogs.com/linyufeng/p/14591357.html 1. 生成证书 https证书可以在网上申请免费证书 https://freessl.cn/ ,也可以本地生成.本地生成可以使用keytools和mkcert, keytools是一个Java数据证书

深入理解 Vue 3 组件通信

在 Vue 3 中,组件通信是一个关键的概念,它允许我们在组件之间传递数据和事件。本文将介绍几种常见的 Vue 3 组件通信方法,包括 props、emits、provide 和 inject、事件总线以及 Vuex 状态管理。 1. 使用 props 和 emits 进行父子组件通信 props

WPF使用AppBar实现窗口停靠,适配缩放、全屏响应和多窗口并列(附封装好即开即用的附加属性)

在吕毅大佬的文章中已经详细介绍了什么是AppBar: WPF 使用 AppBar 将窗口停靠在桌面上,让其他程序不占用此窗口的空间(附我封装的附加属性) - walterlv 即让窗口固定在屏幕某一边,并且保证其他窗口最大化后不会覆盖AppBar占据的区域(类似于Windows任务栏)。 但是在我的

强烈推荐:18.3k star,推荐一款简单易用的HTTP请求流量录制回放工具:Goreplay

在软件开发和测试过程中,我们经常需要对应用程序的网络请求进行录制和回放,以便进行性能分析、压力测试或者模拟复杂的网络环境。今天,我要向大家推荐一款简单易用的 HTTP 请求流量录制回放工具:Goreplay。 1、简介 Goreplay 是一款用 Go 语言编写的 HTTP 请求流量录制回放工具。它

吐血整理如何在Google Earth Engine上写循环 五个代码实例详细拆解

在这里同步一篇本人的原创文章。原文发布于2023年发布在知乎专栏,转移过来时略有修改。全文共计3万余字,希望帮助到GEE小白快速进阶。 引言 这篇文章主要解答GEE中.map()和.iterate()函数的用法。 首先解答一个疑问,为什么需要自己写循环?确实,GEE 为各种数据类型提供了无数常用的内

企业级环境部署:在 Linux 服务器上如何搭建和部署 Python 环境?

在大部分企业里,自动化测试框架落地都肯定会集成到Jenkins服务器上做持续集成测试,自动构建以及发送结果到邮箱,实现真正的无人值守测试。 不过Jenkins搭建一般都会部署在公司的服务器上,不会在私人电脑里,而服务器大部分都是Linux操作系统的。所以,我们如果要在Linux上的Jenkins服务

manim边学边做--Matrix

在代数问题中,矩阵是必不可少的工具,manim中提供了一套展示矩阵(Matrix)的模块,专门用于在动画中显示矩阵格式的数据。关于矩阵的类主要有4个: Matrix:通用的矩阵 IntegerMatrix:元素是整数的矩阵 DecimalMatrix:元素包含小数的矩阵 MobjectMatrix: