FreeSql (三十二)Aop

FreeSql AOP 已有的功能介绍,未来为会根据用户需求不断增强。

审计 CRUD

马云说过,996是修福报。对于多数程序员来说,加班是好事。。。起码不是闲人,不会下岗。

当如果因为某个 sql 骚操作耗时很高,没有一个相关的审计功能,排查起来可以说无从下手,福报与你紧紧相随(哈哈)。

FreeSql 支持简单的类似功能:

fsql.Aop.CurdAfter = (s, e) => {if (e.ElapsedMilliseconds > 200) {//记录日志//发送短信给负责人}
};

是的,只需要一个事件,就可以对全局起到作用。

除了 CurdAfter,还有一个 CurdBefore (在执行 sql 之前触发)。

审计属性值

实现插入/更新时统一处理某些值,比如某属性的雪花算法值、创建时间值、甚至是业务值。

fsql.Aop.AuditValue += (s, e) => {if (e.Column.CsType == typeof(long) && e.Property.GetCustomAttribute<SnowflakeAttribute>(false) != null&& e.Value?.ToString() == 0)e.Value = new Snowflake().GetId();
};class Order {[Snowflake]public long Id { get; set; }//...
}

当属性的类型是 long,并且标记了 [Snowflake],并且当前值是 0,那么在插入/更新时它的值将设置为雪花id值。

说明:SnowflakeAttribute 是使用者您来定义,new Snowflake().GetId() 也是由使用者您来实现

如果命名规范,可以在 aop 里判断,if (e.Property.Name == "createtime") e.Value = DateTime.Now;

审计迁移脚本

FreeSql 自带迁移功能,那么迁移的 SQL 语句长啥样,你可能会好奇。

  • 比如创建表时;

  • 比如添加字段时;

  • 比如修改表名、修改字段名时;

  • 又比如字段类型更改之后时;

这些操作在 FreeSql.CodeFirst 实现下基本不需要理会,而且我们只推荐在开发环境使用自动迁移的功能,正式环境可使用其他工具替代此操作。

但我们仍然可能需要对项目做完整的日志记录。

fsql.Aop.SyncStructureBefore、fsql.Aop.SyncStructureAfter 这两个事件将排上用场。

自定义实体特性

比如项目内已经使用了其它 orm,如 efcore,这样意味着实体中可能存在 [Key],但它与 FreeSql [Column(IsPrimary = true] 不同。

Q: FreeSql 实体特性为啥这么别扭?

A: 为了考虑一致性用法,全部封装在 ColumnAttribute 下,这样用户使用起来,不用到处 using 或者 回忆特性应该用哪个名字,如自增 [Column(IsIdentity = true)] 即可。

FreeSql 提供 AOP 自定义特性功能,实现与多个 orm 共同拥有一套实体特性,可避免重复定义特性。

fsql.Aop.ConfigEntity = (s, e) => {var attr = e.EntityType.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.Schema.TableAttribute), false).FirstOrDefault() as System.ComponentModel.DataAnnotations.Schema.TableAttribute;if (attr != null)e.ModifyResult.Name = attr.Name; //表名
};fsql.Aop.ConfigEntityProperty = (s, e) => {if (e.Property.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.KeyAttribute), false).Any())e.ModifyResult.IsPrimary = true; //主键
};

就这样,FreeSql 的实体特性就可以和 EFCore 那样设定了。其他自增、乐观锁等,依葫芦画瓢便是。

自定义表达式

FreeSql 内部表达式支持非常丰富,对各大数据库的兼容度也做得很好。

有关表达式支持到的程度,可点击查看详细wiki:https://github.com/2881099/FreeSql/wiki/%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%87%BD%E6%95%B0

即便如此丰富,也仍然无法满足用户需求,FreeSql 对外开放了自定义表达式解析接口:

fsql.Aop.ParseExpression = (s, e) => {if (e.Expression.NodeType == Call && e.Expression.Name == "get_Item")e.Result = "1111";
};

这个解析有点复杂,当 e.Expression 很复杂的时候,我们还提供了 e.FreeParse 方法,使用它相当于调用 FreeSql 内置表达式解析引擎,辅助您进行解析。

Aop.Where

FreeSql 提供的 ISelect、IDelete、IUpdate 三大对象,都可以使用 .Where(lambda) 操作,也可以是 .Where(sql) 操作。

Aop.Where 的定位是可拦截 Where 条件。

fsql.Aop.Where = (s, e) => {if (e.Parameter[0]?.ToString() == "1")e.IsCancel = true;
};

Aop.ToList

监控 ToList 返回的的数据,用于拦截重新装饰。

所有通过 FreeSql.Select 查询返回的时候,都可以在这个事件上进行重新装饰。

系列文章导航

  • (一)入门

  • (二)自动迁移实体

  • (三)实体特性

  • (四)实体特性 Fluent Api

  • (五)插入数据

  • (六)批量插入数据

  • (七)插入数据时忽略列

  • (八)插入数据时指定列

  • (九)删除数据

  • (十)更新数据

  • (十一)更新数据 Where

  • (十二)更新数据时指定列

  • (十三)更新数据时忽略列

  • (十四)批量更新数据

  • (十五)查询数据

  • (十六)分页查询

  • (十七)联表查询

  • (十八)导航属性

  • (十九)多表查询

  • (二十)多表查询 WhereCascade

  • (二十一)查询返回数据

  • (二十二)Dto 映射查询

  • (二十三)分组、聚合

  • (二十四)Linq To Sql 语法使用介绍

  • (二十五)延时加载

  • (二十六)贪婪加载 Include、IncludeMany、Dto、ToList

  • (二十七)将已写好的 SQL 语句,与实体类映射进行二次查询

  • (二十八)事务

  • (二十九)Lambda 表达式

  • (三十)读写分离

  • (三十一)分区分表

  • (三十二)Aop

  • (三十三)CodeFirst 类型映射

  • (三十四)CodeFirst 迁移说明

  • (三十五)CodeFirst 自定义特性

转载于:https://www.cnblogs.com/FreeSql/p/11531471.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMvc 注解 @InitBinder 表单多对象精准绑定接收

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 InitBinder用于在Controller中标注于方法&#xff0c;表示为当前控制器注册一个属性编辑器或者其他&#xff0c;只对当前的Controller有…

2014年科目三智能化考试十大必知事项

一、模拟夜考灯光使用 1&#xff0c;夜间通过急转弯/坡道/拱桥/人行横道/或没有交通信号灯控制的路口&#xff1b; 灯光使用&#xff1a;交替使用远近光(变光2次以上) 2&#xff0c;夜间在窄路窄桥与非机动车会车 灯光使用&#xff1a;近光灯 3&#xff0c;夜间在道路上发生故障…

SpringMVC注解 @initbinder 解决类型转换问题

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 使用 SpringMVC 时&#xff0c;常遇到表单中日期字符串和 JavaBean 的 Date 类型的转换&#xff0c;而 SpringMVC 默认不支持这个格式的…

看了就彻底明白人生!!!

出生一张纸&#xff0c;开始一辈子&#xff1b; 毕业一张纸&#xff0c;奋斗一辈子&#xff1b; 婚姻一张纸&#xff0c;折磨一辈子&#xff1b; 做官一张纸&#xff0c;斗争一辈子&#xff1b; 金钱一张纸&#xff0c;辛苦一辈子&#xff1b; 荣誉一张纸&#xff0c;虚名一辈子…

FreeSql (三十三)CodeFirst 类型映射

前面有介绍过几篇 CodeFirst 内容文章&#xff0c;有 《&#xff08;二&#xff09;自动迁移实体》(https://www.cnblogs.com/FreeSql/p/11531301.html)《&#xff08;三&#xff09;实体特性》(https://www.cnblogs.com/FreeSql/p/11531302.html)《&#xff08;四&#xff09;…

FreeSql (三十四)CodeFirst 迁移说明

FreeSql 支持 CodeFirst 迁移结构至数据库&#xff0c;这应该是(O/RM)必须标配的一个功能。 与其他(O/RM)不同FreeSql支持更多的数据库特性&#xff0c;而不只是支持基础的数据类型&#xff0c;这既是优点也是缺点&#xff0c;优点是充分利用数据库特性辅助开发&#xff0c;缺点…

曾国藩家训:三个地方看一个家庭的兴败

第一看&#xff1a;看子孙睡到几点&#xff0c;假如睡到太阳都已经升得很高的时候才起来&#xff0c;那代表这个家族会慢慢懈怠下来;第二看&#xff1a;看子孙有没有做家务&#xff0c;因为勤劳、劳动的习惯影响一个人一辈子;第三看&#xff1a;看后代子孙有没有在读圣贤的经典…

Linux 查看文件指定行数 内容

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1、tail date.log 输出文件末尾的内容&#xff0c;默认10行 tail -20 date.log 输出最后20行的内容 tail -n -20…

FreeSql (三十五)CodeFirst 自定义特性

比如项目内已经使用了其它 orm&#xff0c;如 efcore&#xff0c;这样意味着实体中可能存在 [Key]&#xff0c;但它与 FreeSql [Column(IsPrimary true] 不同。 Q&#xff1a; FreeSql 实体特性为啥这么别扭&#xff1f; A&#xff1a; 为了考虑一致性用法&#xff0c;全部封装…

相随心转,枯荣立现

宋朝时&#xff0c;有高孝标和高孝积两个双胞胎兄弟&#xff0c;举止言谈和才思颖悟都象同一人。十六岁时&#xff0c;他们一齐考上秀才。婚后&#xff0c;父母为使媳妇能辨认丈夫&#xff0c;命令他们穿着不同衣裳和鞋子&#xff0c;以便辨认。有一天&#xff0c;他们遇到陈希…

查看 linux 硬件信息:内存、分区、系统、环境变量、防火墙、路由、端口监听、进程、CPU...

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、linux CPU大小&#xff1b; 其实应该通过Physical Processor ID来区分单核和双核。而Physical Processor ID可以从cpuinfo或者dmesg…

成功人士高效率的工作法

现在的人总是忙个不停&#xff0c;尤其企业家或高阶主管大多身兼数职&#xff0c;为了达成工作目标&#xff0c;不得不经常加班。加上现在社交媒体和各种电子产品的诱惑让时间更加不够用了。每天察看邮件并即时回覆并不代表工作效率。如何排除干扰、克服惰性和避免超时工作才是…

R语言 线性回归分析实例

y,X1,X2,X3 分别表示第 t 年各项税收收入(亿元)&#xff0c;某国生产总值GDP(亿元)&#xff0c;财政支出(亿元)和商品零售价格指数(%). (1) 建立线性模型&#xff1a; ① 自己编写函数&#xff1a; > library(openxlsx) > data read.xlsx("22_data.xlsx",shee…

maven 工程 pom.xml 中 relativePath 的作用

Maven parent.relativePath 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 默认值为../pom.xml 查找顺序&#xff1a;relativePath元素中的地址–本地仓库–远程仓库 设定一个空值将…

【Cef编译】 CefSharp编译失败,检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”...

编译CefSharp生成后一个libcef_dll_wrapper.lib时&#xff0c;供CefSharp使用。结果CefSharp编译的时候报错。遇到以下异常&#xff1a;libcef_dll_wrapper.lib(binary_value_ctocpp.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值…

做老板欣赏的优秀员工 十大准则你达标吗?

在一个企业里&#xff0c;什么样的员工才是优秀的员工&#xff1f;优秀的员工拥有的怎样的特质&#xff1f;同在一个公司工作&#xff0c;同样的学历与相仿的年龄&#xff0c;为什么有的人总是业绩更好、工资更高、待遇更优秀、更能够获得老板的信任&#xff1f;这是目前许多企…

2 小时学会 springboot ( 附实例讲解 )

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一.什么是spring boot Takes an opinionated view of building production-ready Spring applications. Spring Boot favors convention…

管理拾穗:四眼原则

日前听到一位现在服务于一家德国公司的朋友提及他们公司里的主管有一个四眼原则(Four eyes principle)&#xff0c;意思是如果有一份对外的重要文件要发出前&#xff0c;要经过两个人(四个眼睛)看过&#xff0c;确定内容无误之后&#xff0c;再发出。我也曾经在一家国际知名的德…

CEF编译 执行gn args out\Release_GN_x86异常

gn args out\Debug_GN_x86 用来配置编译参数&#xff0c;执行gn args out\Release_GN_x86时异常&#xff1a; Toolchain is out of date. Run "gclient runhooks" to update the toolchain, or set DEPOT_TOOLS_WIN_TOOLCHAIN0 to use the locally installed toolcha…

成功者刻骨铭心的一句话

您知道吗&#xff1f;在这个世界上有许多名人和飞黄腾达的企业家。他们的成功除了靠自己的努力外&#xff0c;还靠来自他人的启发&#xff0c;改变了他们的观点&#xff0c;因而攀上了人生的巅峰。就像美国著名顾问公司盖洛普&#xff08;Gallup&#xff09;的CEO吉姆‧克利夫顿…