FreeSql 全面指南:从基础到高级实战,深入解析读写分离与导航属性
FreeSql 使用详解:从入门到高级
FreeSql 是一个开源的、轻量级的 ORM 框架,它为 .NET 开发人员提供了丰富的功能,包括 CRUD 操作、读写分离、多租户、导航属性支持等。相比于 Entity Framework Core,FreeSql 在性能和特性上有一些独特的优势,特别是在复杂的数据库操作和分布式场景中。本文将详细介绍 FreeSql 的各个功能,从基本的 CRUD 操作开始,逐步深入到读写分离和导航属性等高级特性。
一、FreeSql 入门
1.1 FreeSql 的安装
首先,您需要在项目中安装 FreeSql。可以通过 NuGet 来安装 FreeSql 的包。
Install-Package FreeSql
或者使用 .NET CLI:
dotnet add package FreeSql
1.2 FreeSql 的初始化
初始化 FreeSql 通常需要通过 IFreeSql 接口来操作。最简单的初始化示例如下:
var fsql = new FreeSqlBuilder().UseConnectionString(DataType.MySql, "连接字符串").Build();
这里我们使用了 MySQL 数据库,你可以根据实际需求替换为其他数据库,例如:
DataType.SqlServer用于 SQL ServerDataType.PostgreSQL用于 PostgreSQLDataType.Sqlite用于 SQLite
1.3 基本的 CRUD 操作
FreeSql 提供了简洁的 API 来执行基本的增删改查操作。下面是简单的增删改查示例:
1.3.1 插入数据
var newUser = new User { Name = "张三", Age = 25 };
var insertedId = fsql.Insert(newUser).ExecuteIdentity();
1.3.2 查询数据
var user = fsql.Select<User>().Where(a => a.Id == 1).First();
1.3.3 更新数据
fsql.Update<User>().Set(a => a.Age, 26).Where(a => a.Id == 1).ExecuteAffrows();
1.3.4 删除数据
fsql.Delete<User>().Where(a => a.Id == 1).ExecuteAffrows();
二、FreeSql 进阶功能
2.1 查询优化
FreeSql 提供了丰富的查询功能和优化技巧,比如分页查询、多表查询等。
2.1.1 分页查询
分页查询在大多数应用中是必不可少的,FreeSql 提供了简单的 API 来执行分页查询:
var users = fsql.Select<User>().Page(1, 10).ToList();
2.1.2 多表查询
多表查询也是 ORM 框架中的重要特性。FreeSql 支持多种方式进行多表查询。
var query = fsql.Select<User, Order>().LeftJoin((u, o) => u.Id == o.UserId).Where((u, o) => u.Age > 18).ToList((u, o) => new { u.Name, o.OrderId });
2.2 事务管理
FreeSql 允许您在事务中执行多个数据库操作,确保数据一致性。
using (var transaction = fsql.CreateTransaction())
{try{fsql.Insert(new User { Name = "张三", Age = 30 }).ExecuteAffrows();fsql.Insert(new Order { UserId = 1, Amount = 100 }).ExecuteAffrows();transaction.Commit();}catch{transaction.Rollback();throw;}
}
三、FreeSql 高级特性
3.1 读写分离
FreeSql 内置了读写分离的功能,适用于分布式场景或主从数据库架构。你可以通过配置多个连接字符串来实现读写分离:
var fsql = new FreeSqlBuilder().UseMasterConnectionString("主库连接字符串").UseSlaveConnectionString("从库1连接字符串", "从库2连接字符串").Build();
UseMasterConnectionString用于设置主库的连接字符串,所有写操作将会发送到主库。UseSlaveConnectionString用于配置从库的连接字符串,所有读操作将会发送到从库。
FreeSql 将自动在读操作和写操作之间进行切换,从而实现读写分离。读写分离能够极大地提高系统的性能,尤其是在读操作密集型的应用场景中。
3.2 导航属性
FreeSql 支持导航属性,这使得处理实体之间的关联关系变得非常方便。假设我们有两个实体 User 和 Order,它们之间是一对多的关系:
public class User
{public int Id { get; set; }public string Name { get; set; }[Navigate("UserId")]public List<Order> Orders { get; set; }
}public class Order
{public int Id { get; set; }public int UserId { get; set; }public decimal Amount { get; set; }[Navigate("UserId")]public User User { get; set; }
}
要查询带有导航属性的对象时,FreeSql 会自动加载关联的实体:
var userWithOrders = fsql.Select<User>().IncludeMany(a => a.Orders).Where(a => a.Id == 1).ToOne();
这种方式非常适合处理复杂的实体关系,避免了手动编写复杂的 SQL 语句。
3.3 缓存机制
FreeSql 提供了内置的缓存机制,可以将查询结果缓存起来,以减少数据库的访问次数,提升性能。
var cachedUser = fsql.Select<User>().Where(a => a.Id == 1).Cache(60, "user_cache") // 缓存 60 秒.First();
3.4 数据库审计
FreeSql 还支持数据库审计功能,可以自动跟踪实体的创建、更新和删除时间。你可以通过配置实体的审计属性来启用这一功能:
public class User
{public int Id { get; set; }public string Name { get; set; }public DateTime CreatedTime { get; set; }public DateTime UpdatedTime { get; set; }
}
然后在 FreeSql 配置中启用审计功能:
fsql.Aop.AuditValue += (s, e) =>
{if (e.Property.Name == "CreatedTime" && e.Value == null)e.Value = DateTime.Now;if (e.Property.Name == "UpdatedTime")e.Value = DateTime.Now;
};
四、FreeSql 的最佳实践
- 合理使用缓存:对于频繁查询但数据变动不大的场景,可以启用 FreeSql 的缓存功能,减少数据库的压力。
- 使用读写分离:对于读多写少的系统,可以启用 FreeSql 的读写分离特性,提升读操作的性能。
- 合理设计导航属性:在处理复杂的数据库模型时,导航属性可以简化操作,但应注意防止循环依赖,必要时可进行懒加载处理。
五、总结
FreeSql 提供了强大的 ORM 功能,能够简化复杂的数据库操作,提升开发效率。本文从基本的 CRUD 操作开始,介绍了 FreeSql 的核心功能,包括读写分离、导航属性、缓存等高级特性。通过合理使用这些特性,您可以构建出高性能、可扩展的 .NET 应用。
希望这篇从入门到进阶的 FreeSql 指南能为您在开发中提供帮助。如果你想要进一步深入了解 FreeSql,建议查阅官方文档或社区资源,深入挖掘其更多高级功能。
相关文章:
FreeSql 全面指南:从基础到高级实战,深入解析读写分离与导航属性
FreeSql 使用详解:从入门到高级 FreeSql 是一个开源的、轻量级的 ORM 框架,它为 .NET 开发人员提供了丰富的功能,包括 CRUD 操作、读写分离、多租户、导航属性支持等。相比于 Entity Framework Core,FreeSql 在性能和特性上有一些…...
深度学习之微积分预备知识点
极限(Limit) 定义:表示某一点处函数趋近于某一特定值的过程,一般记为 极限是一种变化状态的描述,核心思想是无限靠近而永远不能到达 公式: 表示 x 趋向 a 时 f(x) 的极限。 知识点口诀解释极限的存在左…...
动态内存
动态内存分配函数:在程序运行时为变量或数据结构开辟的内存空间的函数。 有三个重要的动态分配函数:malloc、calloc、realloc。 动态内存分配函数 malloc 这个函数是向内存中申请一块连续的空间,返回一个指向这个块空间的指针。 如果开辟成…...
C/C++实现植物大战僵尸(PVZ)(打地鼠版)
🚀欢迎互三👉:程序猿方梓燚 💎💎 🚀关注博主,后期持续更新系列文章 🚀如果有错误感谢请大家批评指出,及时修改 🚀感谢大家点赞👍收藏⭐评论✍ 游戏…...
C++ 科目二 智能指针 [weak_ptr] (解决shared_ptr的循环引用问题)
shared_ptr引入的重复计数问题,导致内存泄漏 using namespace std; class CFather; class CSon;class CFather { public:CFather(){}void Set(shared_ptr<CSon> pson){Pson pson;}shared_ptr<CSon> Pson; };class CSon { public:CSon(){}void Set(sha…...
解决RabbitMQ设置TTL过期后不进入死信队列
解决RabbitMQ设置TTL过期后不进入死信队列 问题发现问题解决方法一:只监听死信队列,在死信队列里面处理业务逻辑方法二:改为自动确认模式 问题发现 最近再学习RabbitMQ过程中,看到关于死信队列内容: 来自队列的消息可…...
【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】005 - Kernel 入口 C 函数 start_kernel() 源码分析
【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】005 - Kernel 入口 C 函数 start_kernel 源码分析 系列文章汇总:《鸿蒙OH-v5.0源码分析之 Uboot+Kernel 部分】000 - 文章链接汇总》 本文链接:《【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】005 - Kernel 入口 C 函数 start_ke…...
EndnoteX9安装及使用教程
EndnoteX9安装及使用教程 一、EndNote安装 1.1 下载 这里提供一个下载链接: 链接:https://pan.baidu.com/s/1RlGJksQ67YDIhz4tBmph6Q 提取码:5210 解压完成后,如下所示: 1.2 安装 双击右键进行安装 安装比较简单…...
SQL:子查询
子查询是SQL中强大的功能之一,它允许在一个查询内部嵌套另一个查询,以便处理更复杂的逻辑或数据检索需求。子查询可以用在SELECT、FROM、WHERE、HAVING、IN、ANY、ALL等子句中,根据使用场景和目的的不同,子查询可以分为多种类型。…...
C语言刷题日记(附详解)(5)
一、选填部分 第一题: 下面代码在64位系统下的输出为( ) void print_array(int arr[]) {int n sizeof(arr) / sizeof(arr[0]);for (int i 0; i < n; i)printf("%d", arr[i]); } int main() {int arr[] { 1,2,3,4,5 };print_array(arr);return 0; } A . 1…...
开源加密软件简介
开源加密软件是指源代码公开、可供任何人查看、修改和分发的加密软件。这类软件通常由社区维护,具有高度的透明性和安全性。 1. GnuPG (GNU Privacy Guard) 简介:GnuPG是一种基于OpenPGP标准的加密和签名工具,广泛应用于电子邮件加密和文件…...
【C++学习】 IO 流揭秘:高效数据读写的最佳实践
✨ 今朝有酒今朝醉,明日愁来明日愁 🌏 📃个人主页:island1314 🔥个人专栏:C学习 ⛺️ 欢迎关注:👍点赞 👂Ἷ…...
C#使用TCP-S7协议读写西门子PLC(五)-测试程序
上面四篇我们进行封装连接PLC以及读写PLC内存地址表 C#使用TCP-S7协议读写西门子PLC(一)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(二)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(三)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(四)-CSDN博客 这里我们进行测试操作 西门子PLC-…...
经验——IMX6UL的uboot无法ping主机或Ubuntu
主要描述可能的方向,不涉具体过程,详细操作可以查阅网上相关教程 跟随正点原子教程测试以太网端口时,即便按照步骤多次尝试也无法ping通,后补充了些许网络工程基础知识解决了这个问题。 uboot无法ping主机或Ubuntu有多种可能&…...
AUTOSAR-规范文档版本
https://www.autosar.org/standards 2024年11月(R24-11) Foundation(FO) // TODO Classic(CP) // TODO Adaptive(AP) // TODO 2023年11月(R23-11) Foundation&a…...
网络(四)——HTTP协议
文章目录 认识urlurlencode和urldecodeHTTP协议格式HTTP的方法HTTP的状态码HTTP常见Header 虽然应用层的协议是由人为规定的,但是已经有大佬们定义了一些现成的,又非常好用的应用层协议,供我们直接参考使用. HTTP(超文本传输协议)就是其中之一…...
comfyui中报错 Cmd(‘git‘) failed due to: exit code(128) 如何解决
🎈背景 comfyui今天在安装插件的过程中,发现有个插件第一次安装失败后,再次安装就开始报错了,提示: ComfyUI-Inpaint-CropAndStitch install failed: Bad Request 截图如下: 看下后台的报错: …...
测试-Gatling 与性能测试
Gatling 与性能测试详解 一、什么是性能测试? 性能测试是一种软件测试类型,旨在评估系统在负载下的响应时间、吞吐量和资源利用率等性能指标。通过性能测试,开发者和运维团队能够识别出系统的瓶颈、优化系统性能,并确保其在实际…...
ESRGAN——老旧照片、视频帧的修复和增强,提高图像的分辨率
ESRGAN(Enhanced Super-Resolution GAN):用于提高图像的分辨率,将低质量图像升级为高分辨率版本,常用于老旧照片、视频帧的修复和增强。 一、ESRGAN 介绍 1.1 背景 超分辨率问题是计算机视觉中的一个重要研究领域&a…...
跨界融合:EasyDSS+无人机视频直播推流技术助力行业多场景应用
随着科技的飞速发展,无人机技术与流媒体技术的结合正逐步改变着多个行业的运作模式。其中,EasyDSS互联网视频云服务与无人机视频直播推流技术的结合,更是为警务安防、赛事直播、农业监测等多个领域带来了前所未有的变革。本文将深入探讨EasyD…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
