Sage.FreeSqlManager
1.0.0.4
dotnet add package Sage.FreeSqlManager --version 1.0.0.4
NuGet\Install-Package Sage.FreeSqlManager -Version 1.0.0.4
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Sage.FreeSqlManager" Version="1.0.0.4" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Sage.FreeSqlManager" Version="1.0.0.4" />
<PackageReference Include="Sage.FreeSqlManager" />
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Sage.FreeSqlManager --version 1.0.0.4
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Sage.FreeSqlManager, 1.0.0.4"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Sage.FreeSqlManager@1.0.0.4
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Sage.FreeSqlManager&version=1.0.0.4
#tool nuget:?package=Sage.FreeSqlManager&version=1.0.0.4
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Sage.FreeSqlManager
一个用于管理 FreeSql ORM 实例的 .NET 库,提供了工厂模式、单例模式、DI 注入集成、多租户支持和事务管理等功能,帮助开发者更高效地使用 FreeSql。
功能特点
- 工厂模式:通过工厂类集中管理 FreeSql 实例
- 单例模式:确保每个数据库连接只有一个 FreeSql 实例
- DI 注入集成:无缝集成到 ASP.NET Core 的依赖注入系统
- 多租户支持:提供全局过滤器和租户上下文管理
- 事务管理:支持方法级别的事务控制,提供六种传播方式
- 配置灵活:支持从配置文件或代码中配置数据库连接
- 读写分离:支持数据库读写分离配置
- 监控支持:提供 SQL 命令监控功能
- 支持 AOT 编译优化:兼容 .NET Native AOT 编译
安装
# 使用 NuGet 包管理器
Install-Package Sage.FreeSqlManager
# 或使用 .NET CLI
dotnet add package Sage.FreeSqlManager
快速开始
1. 在 appsettings.json 中配置数据库连接
{
"DbConnections": {
"Default": {
"DataType": "MySql",
"ConnectionString": "Data Source=localhost;Port=3306;User ID=root;Password=123456;Initial Catalog=test_db;Charset=utf8mb4;",
"UseAutoSyncStructure": false,
"UseNoneCommandParameter": true,
"UseMonitorCommand": false,
"EnableTenant": true,
"CommandTimeout": 60
},
"SqlServerDb": {
"DataType": "SqlServer",
"ConnectionString": "Data Source=localhost;Initial Catalog=test_db;User Id=sa;Password=123456;"
}
}
}
2. 服务注册方式
2.1 多库模式(推荐)
using Sage.FreeSqlManager.Extensions;
var builder = WebApplication.CreateBuilder(args);
// 注册 FreeSql 工厂服务(多库模式)
builder.Services.AddFreeSqlFactory();
// 可选:添加仓储支持
builder.Services.AddFreeSqlRepositories(typeof(YourDbContext).Assembly);
var app = builder.Build();
app.Run();
2.2 单库模式(直接注入 IFreeSql)
using Sage.FreeSqlManager.Extensions;
var builder = WebApplication.CreateBuilder(args);
// 方式1:从配置文件读取
// builder.Services.AddFreeSql(builder.Configuration, "Default");
// 方式2:直接指定连接参数
// builder.Services.AddFreeSql(DataType.MySql, "连接字符串");
// 方式3:带事务支持的单库模式(推荐)
builder.Services.AddFreeSqlWithTransaction(builder.Configuration, "Default");
var app = builder.Build();
app.Run();
2.3 注册中间件
// 注册并使用多租户中间件
builder.Services.AddTenantMiddleware(options =>
{
// 配置租户ID解析逻辑
options.TenantIdResolver = async context =>
{
// 从请求头、查询参数或路由中解析租户ID
if (context.Request.Headers.TryGetValue("X-Tenant-Id", out var tenantIdHeader))
{
if (long.TryParse(tenantIdHeader, out var tenantId))
{
return tenantId;
}
}
return 0; // 返回0表示未指定租户
};
options.IsDevelopment = builder.Environment.IsDevelopment();
options.DevDefaultTenantId = 1; // 开发环境默认租户ID
});
// 注册并使用事务中间件
builder.Services.AddTransactionMiddleware();
var app = builder.Build();
// 使用中间件(如果需要)
app.UseTransactionalMiddleware(); // 注意这里是UseTransactionalMiddleware,不是UseTransactionMiddleware
app.UseTenantMiddleware();
app.Run();
使用示例
基本用法
3.1 多库模式使用示例
using Sage.FreeSqlManager.Core;
using Sage.FreeSqlManager.Tenant;
public class UserService
{
private readonly IFreeSqlFactory _freeSqlFactory;
public UserService(IFreeSqlFactory freeSqlFactory)
{
_freeSqlFactory = freeSqlFactory;
}
public List<User> GetUsers()
{
// 获取默认数据库的 FreeSql 实例
var fsql = _freeSqlFactory.GetFreeSql("Default");
return fsql.Select<User>().ToList();
}
public List<Order> GetOrdersFromSqlServer()
{
// 获取指定数据库的 FreeSql 实例
var fsql = _freeSqlFactory.GetFreeSql("SqlServerDb");
return fsql.Select<Order>().ToList();
}
}
3.2 单库模式使用示例
using FreeSql;
public class ProductService
{
private readonly IFreeSql _freeSql;
public ProductService(IFreeSql freeSql)
{
_freeSql = freeSql;
}
public async Task<List<Product>> GetAllProductsAsync()
{
return await _freeSql.Select<Product>().ToListAsync();
}
public async Task AddProductAsync(Product product)
{
await _freeSql.Insert(product).ExecuteAffrowsAsync();
}
}
多租户使用示例
1. 实体类实现 ITenant 接口
using Sage.FreeSqlManager.Tenant;
public class User : ITenant
{
public long Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
// 必须实现的租户ID属性
public long TenantId { get; set; }
}
2. 在控制器中使用租户
using Sage.FreeSqlManager.Core;
using Sage.FreeSqlManager.Tenant;
[ApiController]
[Route("[controller]")]
public class UserController : ControllerBase
{
private readonly IFreeSqlFactory _freeSqlFactory;
public UserController(IFreeSqlFactory freeSqlFactory)
{
_freeSqlFactory = freeSqlFactory;
}
[HttpGet]
public IActionResult GetUsers()
{
// 自动应用当前租户过滤器
var fsql = _freeSqlFactory.GetFreeSql("Default");
var users = fsql.Select<User>().ToList(); // 只会查询当前租户的数据
return Ok(users);
}
[HttpGet("cross-tenant")]
public IActionResult GetUsersForTenant(long tenantId)
{
// 临时切换到指定租户
using var tenantScope = _freeSqlFactory.CreateTenantScope("Default", tenantId);
var users = tenantScope.FreeSql.Select<User>().ToList(); // 查询指定租户的数据
return Ok(users);
}
}
事务管理使用示例
使用 TransactionalAttribute 特性
using Sage.FreeSqlManager.Core;
using Sage.FreeSqlManager.Transaction;
public class OrderService
{
private readonly IFreeSqlFactory _freeSqlFactory;
public OrderService(IFreeSqlFactory freeSqlFactory)
{
_freeSqlFactory = freeSqlFactory;
}
// 使用事务特性装饰方法
[Transactional]
public void CreateOrder(Order order)
{
var fsql = _freeSqlFactory.GetFreeSql("Default");
// 保存订单
fsql.Insert(order).ExecuteAffrows();
// 创建订单明细
foreach (var item in order.Items)
{
item.OrderId = order.Id;
fsql.Insert(item).ExecuteAffrows();
}
// 如果发生异常,所有操作都会回滚
}
// 自定义事务传播方式和隔离级别
[Transactional(Propagation.RequiresNew, IsolationLevel.ReadCommitted)]
public async Task<Order> CreateOrderAsync(Order order)
{
var fsql = _freeSqlFactory.GetFreeSql("Default");
await fsql.Insert(order).ExecuteAffrowsAsync();
return order;
}
}
配置说明
DbConnectionConfig 配置项
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| DataType | DataType | MySql | 数据库类型 |
| ConnectionString | string | - | 数据库连接字符串(必须) |
| CommandTimeout | int | 60 | SQL命令超时时间(秒) |
| UseAutoSyncStructure | bool | false | 是否自动同步结构(生产环境建议关闭) |
| UseNoneCommandParameter | bool | true | 不使用命令参数化执行,针对 Insert/Update |
| UseMonitorCommand | bool | false | 是否监控命令 - 输出SQL到控制台 |
| EnableTenant | bool | false | 是否启用租户模式 |
| UseLazyLoading | bool | false | 是否启用延迟加载 |
| EnableReadWriteSeparation | bool | false | 是否启用读写分离 |
| SlaveConnectionStrings | string[] | null | 从库连接字符串集合,启用读写分离时使用 |
事务传播方式
- Required: 如果当前存在事务,则加入该事务;否则创建一个新事务
- RequiresNew: 创建一个新事务,暂停当前事务(如果存在)
- Supports: 如果当前存在事务,则加入该事务;否则以非事务方式执行
- NotSupported: 以非事务方式执行,如果当前存在事务,则暂停该事务
- Mandatory: 必须在事务中执行,如果当前没有事务,则抛出异常
- Never: 必须在非事务方式执行,如果当前存在事务,则抛出异常
高级特性
读写分离配置
{
"DbConnections": {
"Default": {
"DataType": "MySql",
"ConnectionString": "主库连接字符串",
"EnableReadWriteSeparation": true,
"SlaveConnectionStrings": [
"从库1连接字符串",
"从库2连接字符串"
]
}
}
}
SQL 命令监控
{
"DbConnections": {
"Default": {
"DataType": "MySql",
"ConnectionString": "连接字符串",
"UseMonitorCommand": true
}
}
}
启用后,所有 SQL 命令会输出到控制台和调试输出窗口。
手动创建 FreeSqlFactory
除了通过依赖注入方式使用,还可以手动创建 FreeSqlFactory:
using Sage.FreeSqlManager.Core;
using Sage.FreeSqlManager.Models;
// 创建连接配置字典
var connectionConfigs = new Dictionary<string, DbConnectionConfig>
{
["Default"] = new DbConnectionConfig
{
DataType = DataType.MySql,
ConnectionString = "连接字符串",
UseAutoSyncStructure = false
}
};
// 手动创建工厂实例
var factory = new FreeSqlFactory(connectionConfigs);
var fsql = factory.GetFreeSql("Default");
仓储模式支持
// 1. 定义实体和仓储接口
public class User : ITenant
{
public long Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public long TenantId { get; set; }
}
// 2. 在服务中使用仓储
public class UserService
{
private readonly IBaseRepository<User> _userRepository;
public UserService(IBaseRepository<User> userRepository)
{
_userRepository = userRepository;
}
public async Task<List<User>> GetAllUsersAsync()
{
return await _userRepository.Select.ToListAsync();
}
}
服务注册方法对比
| 注册方法 | 描述 | 适用场景 |
|---|---|---|
AddFreeSql |
注册单个FreeSql实例 | 单数据库简单应用 |
AddFreeSqlWithTransaction |
注册带事务支持的FreeSql实例 | 需要事务管理的单数据库应用 |
AddFreeSqlFactory |
注册FreeSql工厂 | 多数据库应用场景 |
AddFreeSqlRepositories |
添加仓储支持 | 使用仓储模式的应用 |
版本要求
- .NET 9.0 及以上版本
- FreeSql数据库系列 3.5.213 及以上版本
许可证
本项目采用 Apache 2.0 许可证。详情请参阅 LICENSE 文件。
贡献
欢迎提交问题报告和改进建议。如果您想贡献代码,请提交拉取请求。
作者
- LiuPengLai - 甲壳虫科技 欢迎提交问题和功能请求。 QQ Group: 1054304346
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
net10.0
- FreeSql.DbContext (>= 3.5.305)
- Microsoft.AspNetCore.Http.Abstractions (>= 2.3.9)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.2)
- Rougamo.Fody (>= 5.0.2)
-
net9.0
- FreeSql.DbContext (>= 3.5.305)
- Microsoft.AspNetCore.Http.Abstractions (>= 2.3.9)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.2)
- Rougamo.Fody (>= 5.0.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
更新基础库