FreeSql 导航属性的联级保存功能
1|0写在前面
FreeSql 一个款 .net 平台下支持 .net framework 4.5+、.net core 2.1+ 的开源 ORM。单元测试超过3100+,正在不断吸引新的开发者,生命不息开发不止。
和 EFCore 一样,我们也有导航对象,支持【OneToOne】(一对一)、【ManyToOne】(多对一)、【OneToMany】(一对多)、【ParentChild】(父子)、【ManyToMany】(多对多),可以约定配置或手工配置实体间的关联,也可以使用 fluent api 设置关联。
联级保存功能可实现保存对象的时候,将其【OneToMany】、【ManyToMany】导航属性集合也一并保存,本文档说明实现的机制防止误用。
2|0机制规则
【一对多】模型下, 保存时可联级保存实体的属性集合。出于使用安全考虑我们没做完整对比,只实现实体属性集合的添加或更新操作,所以不会删除实体属性集合的数据。
完整对比的功能使用起来太危险,试想下面的场景:
- 保存的时候,实体的属性集合是空的,如何操作?记录全部删除?
- 保存的时候,由于数据库中记录非常之多,那么只想保存子表的部分数据,或者只需要添加,如何操作?
【多对多】模型下,我们对中间表的保存是完整对比操作,对外部实体的操作只作新增(注意不会更新)
- 属性集合为空时,删除他们的所有关联数据(中间表)
- 属性集合不为空时,与数据库存在的关联数据(中间表)完整对比,计算出应该删除和添加的记录
3|0功能开启和关闭
使用 FreeSqlBuilder 创建好的 IFreeSql 对象,联级保存功能,默认是打开的。
全局关闭:
局部关闭:
4|0一对多(OneToMany)代码测试
为了方便展示,以下是一个 ParentChild 关系,其实他也是 OneToMany,只不过是自己指向自己。
初始化测试数据:
1、执行批量插入:
初始执行该方法时,会执行自动创建数据库表操作。如果表已存在,则执行对比,若无变化则不执行操作。
经过断点调试,在控制台可以看到输出 SQL 内容为:
2、测试批量修改:
控制台看到输出 SQL 内容为:
Childs.Clear 执行了,但是控制台没有输出执行删除子集合语句,说明没有做完整的对比
3、子集合表已存在数据,继续添加数据
控制台看到输出 SQL 内容为:
再一次验证了【一对多】(OneToMany) 不会作完整对比,只会添加或更新,添加测试数据的时候用它能简化好多代码。
5|0多对多(ManyToMany)代码测试
以下我们创建了三个类,Song 为本体类,Tag 为外部类,SongTag 为 中间关联数据类,采用命名约定的方式进行了导航关系设置。
初始化测试数据:
1、执行批量插入:
初始执行该方法时,会执行自动创建数据库表操作。如果表已存在,则执行对比,若无变化则不执行操作。
经过断点调试,在控制台可以看到输出 SQL 内容为:
2、测试批量更新,并且中间表数据有了变化
控制台看到输出 SQL 内容为:
执行的过程如下:
- 第一步,批量更新 song 数据
- 第二步,由于是 song 是更新操作,所以需要先查出 song 的关联数据
- 第三步,删除 song 的关联数据(tags[0] 除外),因为 tags[0] 是本次保存有的数据,直白的说就是删除非本次保存的所有关联数据
- 第四步,添加 tags[3] 摇滚外部数据,因为它还不存在外部表
- 第五步,与第二步相同
- 第六步,与第三步相同
- 第七步,插入中间表数据,李白.mp5 与 摇滚 关联
为什么会有这么多步呢?原因是 song 测试数据是两条,double 了,如果单条记录大概是 4-5 条,取决于是否有新增的关联数据需要添加。
3、测试清空关联数据
控制台看到输出 SQL 内容为:
再一次证明【ManyToMany】(多对多) 模型下,中间表是完整的对比操作,外部表只会插入,不更新。
6|0导航对象
除了联级保存功能外,导航对象的主要设计目的为快速在实体间点点点穿插,以便执行 lambda 表达式的查询操作。
如何自定义导航关系?
- 可约定,可不约定;
- 不约定的,需指定 Navigate 特性关联;
- 无关联的,查询时可以指明 On 条件,LeftJoin(a => a.Parent.Id == a.ParentId);
- 已关联的,直接使用导航对象就行,On 条件会自动附上;
也可以使用 FluentApi 在外部设置导航关系:
优先级,特性 > FluentApi
7|0写在最后
FreeSql 发布已经10个月了,元旦将发布 1.0 正式版,希望将来可以成为 .net 社区下给力的轮子,也算是我不枉十几年对 .net 不离不弃的一点贡献吧。
希望 FreeSql 越来越好,
原 .net core 越来越好!(虽然 3.0 升级很多人翻了车,有心中那些情怀在,翻了车最多是骂几句而已,骂完还得接着用它)
教程地址:《FreeSql 新手上路系列教程已发布在 cnblogs》
源码地址:https://github.com/2881099
__EOF__

本文链接:https://www.cnblogs.com/kellynic/p/11610724.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2018-09-30 .net core 程序退出事件