FreeSql 全面指南:从基础到高级实战,深入解析读写分离与导航属性

news/2024/9/19 1:53:01 标签: sql, 数据库, orm

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 Server
  • DataType.PostgreSQL 用于 PostgreSQL
  • DataType.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 支持导航属性,这使得处理实体之间的关联关系变得非常方便。假设我们有两个实体 UserOrder,它们之间是一对多的关系:

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 的最佳实践

  1. 合理使用缓存:对于频繁查询但数据变动不大的场景,可以启用 FreeSql 的缓存功能,减少数据库的压力。
  2. 使用读写分离:对于读多写少的系统,可以启用 FreeSql 的读写分离特性,提升读操作的性能。
  3. 合理设计导航属性:在处理复杂的数据库模型时,导航属性可以简化操作,但应注意防止循环依赖,必要时可进行懒加载处理。

五、总结

FreeSql 提供了强大的 ORM 功能,能够简化复杂的数据库操作,提升开发效率。本文从基本的 CRUD 操作开始,介绍了 FreeSql 的核心功能,包括读写分离、导航属性、缓存等高级特性。通过合理使用这些特性,您可以构建出高性能、可扩展的 .NET 应用。

希望这篇从入门到进阶的 FreeSql 指南能为您在开发中提供帮助。如果你想要进一步深入了解 FreeSql,建议查阅官方文档或社区资源,深入挖掘其更多高级功能。


http://www.niftyadmin.cn/n/5664840.html

相关文章

纯血鸿蒙NEXT常用的几个官方网站

一、官方文档 https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/Readme-CN.md刚入门查看最多的就是UI开发模块&#xff0c;首先要熟悉组件使用 二、官方API参考 https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/development-i…

【C++】多态的认识和理解

个人主页 文章目录 ⭐一、多态的概念&#x1f384;二、多态的定义及实现1.多态的构成2.实现多态的条件3.虚函数的概念4.虚函数的重写和覆盖5.析构函数的重写6.协变7.override和 final关键字8.重载、重写/覆盖、隐藏这三者的区别 &#x1f3e0;三、纯虚函数和抽象类的关系&#…

pgrouting实战应用

1&#xff09;下载地区地区数据&#xff08;下载数据是XYZM 四位数据&#xff09; 2&#xff09;下载裁剪行政区数据 3&#xff09;使用arcgis pro添加路网数据和行政区数据 4&#xff09;裁剪数据&#xff0c;仅历下行政区路网 5&#xff09;arcgis pro要素转线&#xff0…

Android Framework(六)WMS-窗口显示流程——窗口内容绘制与显示

文章目录 窗口显示流程明确目标 窗户内容绘制与显示流程窗口Surface的5种状态完整流程图 应用端处理finishDrawingWindow 的触发 system_service处理WindowState状态 -- COMMIT_DRAW_PENDING本次layout 流程简述applySurfaceChangesTransaction 方法概览READY_TO_SHOW和HAS_DRA…

【资料分析】刷题日记1

第一套 第二个是相比2019年的增长率&#xff0c;错找为同比增长率 延申&#xff1a; 当出口和进口相比2019年的增长率相同时&#xff0c;可以用盐水解决 √ 一个假设分配&#xff08;第二次是1.4取1&#xff09;加法对比选项 基期倍数&#xff1a; 求A是B的多少倍&#x…

从概念到现实,数字影像产业基地助力产业升级!

在当今这个日新月异的数字化时代&#xff0c;数字影像产业基地作为技术创新与产业升级的重要载体&#xff0c;正逐步将前沿的影像技术概念转化为现实生产力&#xff0c;深刻改变着传统产业的格局与未来。 一、技术创新的孵化器 数字影像产业基地不仅是技术的聚集地&#xff0c…

牛客周赛 Round 60(思维、逆元、组合数、概率DP)

文章目录 牛客周赛 Round 60(思维、逆元、组合数、概率DP)A. 困难数学题B. 构造序列C. 连点成线D. 我们N个真是太厉害了(思维)E. 折返跑(小费马定理求逆元、组合数)F. 口吃&#xff08;概率DP&#xff09; 牛客周赛 Round 60(思维、逆元、组合数、概率DP) F题&#xff0c;概率D…

【鸿蒙 HarmonyOS NEXT】组件嵌套滚动:nestedScroll

✨本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✨踩坑不易&#xff0c;还希望各位大佬支持一下&#xff0c;在GitHub给我点个 Start ⭐⭐&#x1f44d;&#x1f44d; ✍GitHub开源项目地址&#x1f449;&#xff1a;https://github.com/cheinlu/groundhog-charging-syst…