Rafy 框架又添新成员:幽灵插件。本文将解释该插件的场景、使用方法、原理。

场景


在开发各类数据库应用系统时,往往需要在删除数据时不是真正地删除数据,而只是把数据标识为‘已删除’状态。这些数据在业务逻辑上是已经完全删除、不可用的数据,但是不能在数据库中真正的把它们删除,而是需要永久保留这些历史数据。即开发人员常说的‘假删除’功能。

这种需求往往是系统级的。往往不是针对某一张表,而很可能是针对系统中的所有表都需要实现‘假删除’功能。

使用方法


由于这种需求比较常见,所以我们决定专门为该功能写一个独立的 Rafy 插件。这样,开发人员需要实现假删除功能时,只需要引用该插件后,系统中所有删除的实体都自动变为‘幽灵’,同时这些幽灵数据在仓库的所有查询中都将被自动过滤。

使用步骤:

  1. 通过 Nuget Package Manager 搜索并安装 Rafy.Domain.EntityPhantom 插件。
  2. 在 DomainApp 中添加该插件:
    class JXCApp : DomainApp
    {protected override void InitEnvironment(){//添加幽灵插件到 Rafy 应用程序集中。RafyEnvironment.DomainPlugins.Add(new Rafy.Domain.EntityPhantom.EntityPhantomPlugin());RafyEnvironment.DomainPlugins.Add(new JXCPlugin());base.InitEnvironment();}
    }
  3. 为需要幽灵功能的实体打开该功能,需要在实体元数据配置中进行配置:
    internal class UserConfig : JXCEntityConfig<User>
    {protected override void ConfigMeta(){Meta.MapTable().MapAllProperties();//在实体配置中加入此行代码,为实体启用幽灵功能。Meta.EnablePhantoms();}
    }

效果


所有继承自 Entity 的实体都会统一的添加一个 IsPhantom 的属性。这个属性表示这个实体是否为‘幽灵’,即已经删除的数据。

  • 开发者可以使用 Meta.EnablePhantoms() 来为某个指定的实体类型开启‘幽灵’功能。
  • 开启该功能的实体的 IsPhantom 属性会自动映射到数据库中。
  • 在保存实体时,如果要删除一个聚合实体,则这个聚合中的所有实体都将会被标记为‘幽灵’状态。
  • 在查询实体时,所有的查询,都将会自动过滤掉所有‘幽灵’状态的数据。(手写 SQL 查询的场景不在考虑范围内。)
  • 使用批量导入数据插件进行数据的批量导入时,批量删除的实体同样都会被标记为‘幽灵’状态。

运行程序后,数据库中的字段,已经自动添加上 IsPhantom 字段了:

在使用 GetAll 查询所有实体时,框架自动加上一 IsPhantom = false 的过滤条件:

SELECT *
FROM [User]
WHERE [User].[IsPhantom] = @p0
ORDER BY [User].[Id] ASC
Parameters:False

数据的删除,变为更新表中对应行的 IsPhantom 字段为 True:

UPDATE [User] SET [Name] = @p0,[IsPhantom] = @p1 WHERE [Id] = @p2
Parameters:"Name",True,3

原理


幽灵插件的原理比较简单。在 Rafy 框架的基础上,以插件的形式对 Rafy 框架中实体的数据层进行了扩展。在启用实体的幽灵功能后,该实体的 DataProvider 类型的 Deleting、Querying 事件都会被监听并扩展:

/// <summary>
/// 数据的删除、查询的拦截器。
/// </summary>
internal static class PhantomDataInterceptor
{internal static void Intercept(){RepositoryDataProvider.Deleting += RepositoryDataProvider_Deleting;RepositoryDataProvider.Querying += RepositoryDataProvider_Querying;}
}

在查询时,框架自动分析出当前查询的 SQL 树,并在主查询上加上 IsPhantom = false 的过滤条件。

有兴趣的同学,可以查看 Rafy 框架源码。

PS:该文已经纳入《 Rafy 用户手册》中。

Rafy 框架 - 幽灵插件(假删除)相关推荐

  1. Rafy 框架 - 流水号插件

    Rafy 框架又添新成员:流水号插件.本文将解释 Rafy 框架中的流水插件的场景.使用方法. 场景 在开发各类数据库应用系统时,往往需要生成从一开始的流水号,有时还需要按月或者按日进行独立生成,如下 ...

  2. Rafy 框架 - 使用 SqlTree 查询

    本文介绍如何使用 Rafy 框架中的 Sql Tree 查询: 除了开发者常用的 Linq 查询,Rafy 框架还提供了 Sql 语法树的方式来进行查询. 这种查询方式下,开发者不需要直接编写真正的 ...

  3. 【Android 插件化】Hook 插件化框架总结 ( 插件包管理 | Hook Activity 启动流程 | Hook 插件包资源加载 ) ★★★

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  4. Bootstrap4+MySQL前后端综合实训-Day08-AM【多表查询sql语句、关联数据的假删除、自动增长主键的获取、栏目管理“数据编辑”按钮的实现】

    [Bootstrap4前端框架+MySQL数据库]前后端综合实训[10天课程 博客汇总表 详细笔记][附:实训所有代码] 目   录 多表查询sql语句 关联数据的假删除(status状态码/数据可恢 ...

  5. 【第48天】AJAX在原生JS中的使用,处理XML数据以及DBUtils的使用,假删除(标记删除)

    1 介绍 1.1 同步和异步 1.1.1 基于AJAX的异步传输与传统同步传输的对比 1.1.2 使用时间线表示同步和异步在过程上的区别 1.2 JS与AJAX的关系 1.3 AJAX用到的技术 1. ...

  6. 复选框批量删除-ajax-ssm项目(update实现假删除)

    文末第7部分有效果演示!!! 目录 1.StudentMapper.xml文件中配置的sql语句 2.StudentMapper接口层 3.设计页面复选框全选与各自选择 4.通过js和ajax发出请求 ...

  7. 【Android 插件化】Hook 插件化框架 ( 创建插件应用 | 拷贝插件 APK | 初始化插件包 | 测试插件 DEX 字节码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  8. 【Android 插件化】Hook 插件化框架 ( 合并 “插件包“ 与 “宿主“ 中的 Element[] dexElements | 设置合并后的 Element[] 数组 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  9. 【Android 插件化】Hook 插件化框架 ( hook 插件化原理 | 插件包管理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

最新文章

  1. ajax 阻止默认提交,jQuery验证插件:在对ajax调用servlet时,submitHandler不会阻止默认提交-返回false无效...
  2. java程序实验总结_Java Socket 编程实验总结
  3. Hololens开发基础知识
  4. js-window对象的方法和属性资料
  5. 2022-03-09
  6. OpenCV使用形态学转换提取水平和垂直线的实例(附完整代码)
  7. There are no packages available for install
  8. 试题 历届试题 翻硬币(贪心)
  9. node 安装 webpack
  10. application.properties数据库敏感信息加密这么简单?
  11. vscode vim快捷键失效_VIM真的好用吗?到底要不要学习VIM?
  12. 解决eclipse 端口被占用问题
  13. 指向API的函数指针定义方法
  14. envi查看灰度直方图_ENVI实习直方图匹配校正分类.doc
  15. 今年秋季 MacBook Pro 将迎来六大变化
  16. 特征选择:嵌入法---《菜菜机器学习笔记》
  17. Egret 配置主题
  18. ESP8266连接网络,获取网络天气api
  19. 数学在计算机科学中的作用,计算机科学中数学的重要性及其运用
  20. 高校实验室仪器设备管理系统/实验室管理系统

热门文章

  1. HDU6168 Numbers
  2. [补档]暑假集训D5总结
  3. 内存泄露检测 vld
  4. python作用域链_具有动态特性的Python嵌套作用域
  5. gitlab 使用教程
  6. 内存,RAM(DDR),ROM(EEPROM、flash),存储卡(emmc,sd,tf)以及Cache的区别与联系
  7. vsftp账号_Linux入门-CentOS7安装vsftp
  8. 内存中发堆和栈,栈是运行时的单位,而堆是存储的单位
  9. Gdevops广州站:跟一众技术老将聊聊时下运维、数据库、金融科技应“云”而生的技术创新...
  10. 计算机系统基础:磁盘调度知识笔记