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" />
                    
Directory.Packages.props
<PackageReference Include="Sage.FreeSqlManager" />
                    
Project file
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
                    
#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
                    
Install as a Cake Addin
#tool nuget:?package=Sage.FreeSqlManager&version=1.0.0.4
                    
Install as a Cake Tool

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 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.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.0.4 98 1/14/2026
1.0.0.3 201 10/15/2025
1.0.0.2 199 10/13/2025
1.0.0.1 202 10/13/2025
1.0.0 151 10/11/2025

更新基础库