胖乐乐 發表於 2025-8-12 15:45:46

SqlSugar ORM框架安装配置使用详解

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">简介</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">为什么选择SqlSugar?</a></li></ul><li><a href="#_label1">特性与优势</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_1">核心特性</a></li><li><a href="#_lab2_1_2">性能优势</a></li></ul><li><a href="#_label2">安装与配置</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_3">NuGet包安装</a></li><li><a href="#_lab2_2_4">基础配置</a></li><li><a href="#_lab2_2_5">多数据库配置</a></li></ul><li><a href="#_label3">基础使用</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_6">实体类定义</a></li><li><a href="#_lab2_3_7">基本CRUD操作</a></li></ul><li><a href="#_label4">实体映射</a></li><ul class="second_class_ul"><li><a href="#_lab2_4_8">特性配置</a></li><li><a href="#_lab2_4_9">Fluent API配置</a></li><li><a href="#_lab2_4_10">枚举映射</a></li></ul><li><a href="#_label5">数据库操作</a></li><ul class="second_class_ul"><li><a href="#_lab2_5_11">数据库初始化</a></li><li><a href="#_lab2_5_12">表结构管理</a></li><li><a href="#_lab2_5_13">索引管理</a></li></ul><li><a href="#_label6">查询操作</a></li><ul class="second_class_ul"><li><a href="#_lab2_6_14">Lambda表达式查询</a></li><li><a href="#_lab2_6_15">分页查询</a></li><li><a href="#_lab2_6_16">联表查询</a></li><li><a href="#_lab2_6_17">子查询</a></li><li><a href="#_lab2_6_18">聚合查询</a></li></ul><li><a href="#_label7">高级功能</a></li><ul class="second_class_ul"><li><a href="#_lab2_7_19">事务管理</a></li><li><a href="#_lab2_7_20">批量操作</a></li><li><a href="#_lab2_7_21">缓存功能</a></li><li><a href="#_lab2_7_22">读写分离</a></li><li><a href="#_lab2_7_23">多租户支持</a></li></ul><li><a href="#_label8">性能优化</a></li><ul class="second_class_ul"><li><a href="#_lab2_8_24">查询优化</a></li><li><a href="#_lab2_8_25">连接池优化</a></li><li><a href="#_lab2_8_26">SQL优化建议</a></li></ul><li><a href="#_label9">最佳实践</a></li><ul class="second_class_ul"><li><a href="#_lab2_9_27">1. 仓储模式实现</a></li><li><a href="#_lab2_9_28">2. 依赖注入配置</a></li><li><a href="#_lab2_9_29">3. 配置管理</a></li><li><a href="#_lab2_9_30">4. 异常处理</a></li><li><a href="#_lab2_9_31">5. 单元测试</a></li></ul><li><a href="#_label10">总结</a></li><ul class="second_class_ul"><li><a href="#_lab2_10_32">主要优点</a></li><li><a href="#_lab2_10_33">适用场景</a></li><li><a href="#_lab2_10_34">注意事项</a></li></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>简介</h2>
<p>SqlSugar是一个轻量级、高性能的.NET ORM框架,由中国开发者维护,专为简化数据库操作而设计。它支持多种数据库,提供了丰富的功能和优秀的性能表现,是.NET开发中非常受欢迎的ORM选择。</p>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>为什么选择SqlSugar?</h3>
<ul><li><strong>轻量级</strong>:框架体积小,启动快速</li><li><strong>高性能</strong>:优化的SQL生成和执行机制</li><li><strong>易用性</strong>:简洁的API设计,学习成本低</li><li><strong>多数据库支持</strong>:支持主流数据库系统</li><li><strong>中文文档</strong>:完善的中文文档和社区支持</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>特性与优势</h2>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>核心特性</h3>
<ul><li><strong>多数据库支持</strong>
<ul><li>SQL Server</li><li>MySQL</li><li>PostgreSQL</li><li>Oracle</li><li>SQLite</li><li>达梦数据库</li><li>人大金仓等国产数据库</li></ul></li><li><strong>丰富的查询方式</strong><ul><li>Lambda表达式查询</li><li>SQL语句查询</li><li>存储过程调用</li><li>动态查询构建</li></ul></li><li><strong>代码生成功能</strong><ul><li>根据数据库表生成实体类</li><li>自动生成仓储层代码</li><li>支持模板自定义</li></ul></li><li><strong>事务管理</strong><ul><li>自动事务管理</li><li>手动事务控制</li><li>分布式事务支持</li></ul></li></ul>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>性能优势</h3>
<div class="jb51code"><pre class="brush:csharp;">// 高性能的批量操作
var users = new List&lt;User&gt;();
for (int i = 0; i &lt; 10000; i++)
{
    users.Add(new User { Name = $"User{i}", Age = 20 + i % 50 });
}
// 批量插入,性能优异
db.Insertable(users).ExecuteCommand();</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>安装与配置</h2>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>NuGet包安装</h3>
<div class="jb51code"><pre class="brush:csharp;"># 核心包
Install-Package SqlSugar
# 特定数据库扩展
Install-Package SqlSugar.SqlServer
Install-Package SqlSugar.MySql
Install-Package SqlSugar.PostgreSQL</pre></div>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>基础配置</h3>
<div class="jb51code"><pre class="brush:csharp;">using SqlSugar;
// 数据库连接配置
var db = new SqlSugarClient(new ConnectionConfig()
{
    ConnectionString = "Server=.;Database=TestDB;Trusted_Connection=true;",
    DbType = DbType.SqlServer,
    IsAutoCloseConnection = true, // 自动关闭连接
    InitKeyType = InitKeyType.Attribute // 使用特性初始化
});
// 日志配置
db.Aop.OnLogExecuting = (sql, pars) =&gt;
{
    Console.WriteLine($"SQL: {sql}");
    Console.WriteLine($"Parameters: {string.Join(",", pars?.Select(p =&gt; $"{p.ParameterName}:{p.Value}"))}");
};</pre></div>
<p class="maodian"><a name="_lab2_2_5"></a></p><h3>多数据库配置</h3>
<div class="jb51code"><pre class="brush:csharp;">var configs = new List&lt;ConnectionConfig&gt;
{
    new ConnectionConfig
    {
      ConfigId = "db1",
      ConnectionString = "SqlServer连接字符串",
      DbType = DbType.SqlServer,
      IsAutoCloseConnection = true
    },
    new ConnectionConfig
    {
      ConfigId = "db2",
      ConnectionString = "MySQL连接字符串",
      DbType = DbType.MySql,
      IsAutoCloseConnection = true
    }
};
var db = new SqlSugarScope(configs);
// 切换数据库
var sqlServerDb = db.GetConnection("db1");
var mysqlDb = db.GetConnection("db2");</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>基础使用</h2>
<p class="maodian"><a name="_lab2_3_6"></a></p><h3>实体类定义</h3>
<div class="jb51code"><pre class="brush:csharp;">
public class User
{
   
    public int Id { get; set; }
   
    public string Name { get; set; }
   
    public int? Age { get; set; }
   
    public DateTime? CreateTime { get; set; }
    // 忽略该字段
    public string TempProperty { get; set; }
}</pre></div>
<p class="maodian"><a name="_lab2_3_7"></a></p><h3>基本CRUD操作</h3>
<div class="jb51code"><pre class="brush:csharp;">// 插入
var user = new User { Name = "张三", Age = 25, CreateTime = DateTime.Now };
var id = db.Insertable(user).ExecuteReturnIdentity();
// 查询
var users = db.Queryable&lt;User&gt;().ToList();
var user = db.Queryable&lt;User&gt;().Where(u =&gt; u.Id == 1).First();
// 更新
db.Updateable&lt;User&gt;()
.SetColumns(u =&gt; new User { Age = 26 })
.Where(u =&gt; u.Id == 1)
.ExecuteCommand();
// 删除
db.Deleteable&lt;User&gt;().Where(u =&gt; u.Id == 1).ExecuteCommand();</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>实体映射</h2>
<p class="maodian"><a name="_lab2_4_8"></a></p><h3>特性配置</h3>
<div class="jb51code"><pre class="brush:csharp;">
public class Product
{
   
    public int ProductId { get; set; }
   
    public string Name { get; set; }
   
    public decimal Price { get; set; }
   
    public DateTime? CreateDate { get; set; }
    // JSON字段映射
    public List&lt;string&gt; Tags { get; set; }
}</pre></div>
<p class="maodian"><a name="_lab2_4_9"></a></p><h3>Fluent API配置</h3>
<div class="jb51code"><pre class="brush:csharp;">db.CodeFirst.ConfigQuery&lt;User&gt;()
.HasKey(u =&gt; u.Id)
.HasIndex(u =&gt; u.Name, true) // 唯一索引
.HasColumn(u =&gt; u.Name, col =&gt; col.IsNullable(false).HasMaxLength(50))
.HasColumn(u =&gt; u.Age, col =&gt; col.IsNullable(true));
</pre></div>
<p class="maodian"><a name="_lab2_4_10"></a></p><h3>枚举映射</h3>
<div class="jb51code"><pre class="brush:csharp;">public enum UserStatus
{
    Active = 1,
    Inactive = 0,
    Deleted = -1
}
public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
   
    public UserStatus Status { get; set; }
}</pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>数据库操作</h2>
<p class="maodian"><a name="_lab2_5_11"></a></p><h3>数据库初始化</h3>
<div class="jb51code"><pre class="brush:csharp;">// 创建数据库
db.DbMaintenance.CreateDatabase();
// 根据实体创建表
db.CodeFirst.InitTables&lt;User, Product, Order&gt;();
// 检查表是否存在
if (!db.DbMaintenance.IsAnyTable("Users"))
{
    db.CodeFirst.InitTables&lt;User&gt;();
}</pre></div>
<p class="maodian"><a name="_lab2_5_12"></a></p><h3>表结构管理</h3>
<div class="jb51code"><pre class="brush:csharp;">// 添加列
db.DbMaintenance.AddColumn("Users", new DbColumnInfo
{
    DbColumnName = "Email",
    DataType = "varchar",
    Length = 100,
    IsNullable = true
});
// 删除列
db.DbMaintenance.DropColumn("Users", "TempColumn");
// 重命名表
db.DbMaintenance.RenameTable("OldTableName", "NewTableName");</pre></div>
<p class="maodian"><a name="_lab2_5_13"></a></p><h3>索引管理</h3>
<div class="jb51code"><pre class="brush:csharp;">// 创建索引
db.DbMaintenance.AddIndex("Users", new string[] { "Name", "Age" });
// 删除索引
db.DbMaintenance.DropIndex("Users", "IX_Users_Name_Age");
// 获取索引信息
var indexes = db.DbMaintenance.GetIndexList("Users");</pre></div>
<p class="maodian"><a name="_label6"></a></p><h2>查询操作</h2>
<p class="maodian"><a name="_lab2_6_14"></a></p><h3>Lambda表达式查询</h3>
<div class="jb51code"><pre class="brush:csharp;">// 基础查询
var users = db.Queryable&lt;User&gt;()
            .Where(u =&gt; u.Age &gt; 18)
            .OrderBy(u =&gt; u.CreateTime)
            .ToList();
// 复杂条件查询
var result = db.Queryable&lt;User&gt;()
               .Where(u =&gt; u.Name.Contains("张") &amp;&amp; u.Age.HasValue)
               .WhereIF(!string.IsNullOrEmpty(searchName), u =&gt; u.Name == searchName)
               .Select(u =&gt; new
               {
                   u.Id,
                   u.Name,
                   Age = u.Age ?? 0,
                   AgeGroup = u.Age &gt; 30 ? "成年" : "青年"
               })
               .ToList();</pre></div>
<p class="maodian"><a name="_lab2_6_15"></a></p><h3>分页查询</h3>
<div class="jb51code"><pre class="brush:csharp;">// 方式一:使用ToPageList
int pageIndex = 1, pageSize = 10;
var pageResult = db.Queryable&lt;User&gt;()
                   .Where(u =&gt; u.Age &gt; 18)
                   .OrderBy(u =&gt; u.Id)
                   .ToPageList(pageIndex, pageSize);
Console.WriteLine($"总记录数: {pageResult.TotalCount}");
Console.WriteLine($"总页数: {pageResult.TotalPages}");
// 方式二:使用ToOffsetPage
var offsetResult = db.Queryable&lt;User&gt;()
                     .Where(u =&gt; u.Age &gt; 18)
                     .OrderBy(u =&gt; u.Id)
                     .ToOffsetPage(pageIndex, pageSize);</pre></div>
<p class="maodian"><a name="_lab2_6_16"></a></p><h3>联表查询</h3>
<div class="jb51code"><pre class="brush:csharp;">// 内连接
var result = db.Queryable&lt;User, Order&gt;((u, o) =&gt; new JoinQueryInfos(
                JoinType.Inner, u.Id == o.UserId))
               .Select((u, o) =&gt; new
               {
                   UserName = u.Name,
                   OrderId = o.Id,
                   OrderAmount = o.Amount
               })
               .ToList();
// 左连接
var leftJoinResult = db.Queryable&lt;User&gt;()
                     .LeftJoin&lt;Order&gt;((u, o) =&gt; u.Id == o.UserId)
                     .Select((u, o) =&gt; new
                     {
                           u.Name,
                           OrderCount = SqlFunc.IsNull(o.Id, 0)
                     })
                     .ToList();</pre></div>
<p class="maodian"><a name="_lab2_6_17"></a></p><h3>子查询</h3>
<div class="jb51code"><pre class="brush:csharp;">// 子查询示例
var subQuery = db.Queryable&lt;Order&gt;()
               .Where(o =&gt; o.Status == OrderStatus.Completed)
               .GroupBy(o =&gt; o.UserId)
               .Select(o =&gt; new { UserId = o.UserId, TotalAmount = SqlFunc.Sum(o.Amount) });
var result = db.Queryable&lt;User&gt;()
               .Where(u =&gt; SqlFunc.Subqueryable(subQuery)
                        .Where(s =&gt; s.UserId == u.Id &amp;&amp; s.TotalAmount &gt; 1000)
                        .Any())
               .ToList();</pre></div>
<p class="maodian"><a name="_lab2_6_18"></a></p><h3>聚合查询</h3>
<div class="jb51code"><pre class="brush:csharp;">// 分组聚合
var groupResult = db.Queryable&lt;Order&gt;()
                  .GroupBy(o =&gt; new { o.UserId, o.Status })
                  .Select(o =&gt; new
                  {
                        o.UserId,
                        o.Status,
                        Count = SqlFunc.Count(o.Id),
                        TotalAmount = SqlFunc.Sum(o.Amount),
                        AvgAmount = SqlFunc.Avg(o.Amount),
                        MaxAmount = SqlFunc.Max(o.Amount),
                        MinAmount = SqlFunc.Min(o.Amount)
                  })
                  .ToList();
// Having子句
var havingResult = db.Queryable&lt;Order&gt;()
                     .GroupBy(o =&gt; o.UserId)
                     .Having(o =&gt; SqlFunc.Sum(o.Amount) &gt; 5000)
                     .Select(o =&gt; new
                     {
                         UserId = o.UserId,
                         TotalAmount = SqlFunc.Sum(o.Amount)
                     })
                     .ToList();</pre></div>
<p class="maodian"><a name="_label7"></a></p><h2>高级功能</h2>
<p class="maodian"><a name="_lab2_7_19"></a></p><h3>事务管理</h3>
<div class="jb51code"><pre class="brush:csharp;">// 自动事务
try
{
    db.BeginTran();
    // 执行多个操作
    db.Insertable(user).ExecuteCommand();
    db.Updateable(order).ExecuteCommand();
    db.Deleteable&lt;Product&gt;().Where(p =&gt; p.Id == 1).ExecuteCommand();
    db.CommitTran();
}
catch (Exception ex)
{
    db.RollbackTran();
    throw;
}
// 使用using语句
using (var tran = db.UseTran())
{
    db.Insertable(user).ExecuteCommand();
    db.Updateable(order).ExecuteCommand();
    tran.Complete(); // 提交事务
}</pre></div>
<p class="maodian"><a name="_lab2_7_20"></a></p><h3>批量操作</h3>
<div class="jb51code"><pre class="brush:csharp;">// 批量插入
var users = new List&lt;User&gt;();
for (int i = 0; i &lt; 10000; i++)
{
    users.Add(new User { Name = $"User{i}", Age = 20 + i % 50 });
}
// 高性能批量插入
db.Fastest&lt;User&gt;().BulkCopy(users);
// 批量更新
var updateUsers = db.Queryable&lt;User&gt;().Where(u =&gt; u.Age &lt; 25).ToList();
updateUsers.ForEach(u =&gt; u.Age += 1);
db.Fastest&lt;User&gt;().BulkUpdate(updateUsers);
// 批量删除
db.Deleteable&lt;User&gt;().Where(u =&gt; u.Age &gt; 60).ExecuteCommand();</pre></div>
<p class="maodian"><a name="_lab2_7_21"></a></p><h3>缓存功能</h3>
<div class="jb51code"><pre class="brush:csharp;">// 查询缓存
var cachedUsers = db.Queryable&lt;User&gt;()
                  .Where(u =&gt; u.Status == UserStatus.Active)
                  .WithCache(60) // 缓存60秒
                  .ToList();
// 自定义缓存键
var customCachedUsers = db.Queryable&lt;User&gt;()
                        .Where(u =&gt; u.Age &gt; 18)
                        .WithCache("active_users", 300) // 自定义缓存键,缓存5分钟
                        .ToList();
// 清除缓存
db.RemoveDataCache("active_users");</pre></div>
<p class="maodian"><a name="_lab2_7_22"></a></p><h3>读写分离</h3>
<div class="jb51code"><pre class="brush:csharp;">var configs = new List&lt;ConnectionConfig&gt;
{
    new ConnectionConfig
    {
      ConfigId = "master",
      ConnectionString = "主库连接字符串",
      DbType = DbType.SqlServer,
      IsAutoCloseConnection = true
    },
    new ConnectionConfig
    {
      ConfigId = "slave1",
      ConnectionString = "从库1连接字符串",
      DbType = DbType.SqlServer,
      IsAutoCloseConnection = true,
      SlaveConnectionConfigs = new List&lt;SlaveConnectionConfig&gt;
      {
            new SlaveConnectionConfig { HitRate = 50 }, // 50%命中率
      }
    }
};
var db = new SqlSugarScope(configs);
// 查询自动使用从库
var users = db.Queryable&lt;User&gt;().ToList();
// 强制使用主库查询
var masterUsers = db.GetConnection("master").Queryable&lt;User&gt;().ToList();</pre></div>
<p class="maodian"><a name="_lab2_7_23"></a></p><h3>多租户支持</h3>
<div class="jb51code"><pre class="brush:csharp;">// 配置多租户
db.SetTenantTable("tenant1", "Users_Tenant1");
db.SetTenantTable("tenant2", "Users_Tenant2");
// 切换租户
db.ChangeTenant("tenant1");
var tenant1Users = db.Queryable&lt;User&gt;().ToList(); // 查询Users_Tenant1表
db.ChangeTenant("tenant2");
var tenant2Users = db.Queryable&lt;User&gt;().ToList(); // 查询Users_Tenant2表</pre></div>
<p class="maodian"><a name="_label8"></a></p><h2>性能优化</h2>
<p class="maodian"><a name="_lab2_8_24"></a></p><h3>查询优化</h3>
<div class="jb51code"><pre class="brush:csharp;">// 1. 使用异步操作
var usersAsync = await db.Queryable&lt;User&gt;()
                         .Where(u =&gt; u.Age &gt; 18)
                         .ToListAsync();
// 2. 只查询需要的字段
var userNames = db.Queryable&lt;User&gt;()
                  .Select(u =&gt; u.Name)
                  .ToList();
// 3. 使用NoLock(SQL Server)
var noLockUsers = db.Queryable&lt;User&gt;()
                  .With(SqlWith.NoLock)
                  .ToList();
// 4. 分页查询大数据量
var largeDataPage = db.Queryable&lt;User&gt;()
                      .OrderBy(u =&gt; u.Id)
                      .ToOffsetPage(1, 1000);</pre></div>
<p class="maodian"><a name="_lab2_8_25"></a></p><h3>连接池优化</h3>
<div class="jb51code"><pre class="brush:csharp;">var config = new ConnectionConfig
{
    ConnectionString = "连接字符串",
    DbType = DbType.SqlServer,
    IsAutoCloseConnection = true,
    // 连接池配置
    ConfigureExternalServices = new ConfigureExternalServices
    {
      DataInfoCacheService = new HttpRuntimeCache(), // 使用缓存
      SqlFuncServices = new List&lt;SqlFuncExternal&gt;() // 自定义SQL函数
    },
    // 性能配置
    MoreSettings = new ConnMoreSettings
    {
      IsAutoRemoveDataCache = true, // 自动清理缓存
      IsWithNoLockQuery = true, // 默认使用NoLock
      DefaultCacheDurationInSeconds = 600 // 默认缓存时间
    }
};</pre></div>
<p class="maodian"><a name="_lab2_8_26"></a></p><h3>SQL优化建议</h3>
<div class="jb51code"><pre class="brush:csharp;">// 1. 避免N+1查询问题
var usersWithOrders = db.Queryable&lt;User&gt;()
                        .Includes(u =&gt; u.Orders) // 一次性加载关联数据
                        .ToList();
// 2. 使用批量操作代替循环
// 错误方式
foreach (var user in users)
{
    db.Updateable(user).ExecuteCommand(); // N次数据库访问
}
// 正确方式
db.Updateable(users).ExecuteCommand(); // 1次数据库访问
// 3. 合理使用索引
var indexedQuery = db.Queryable&lt;User&gt;()
                     .Where(u =&gt; u.Email == "test@example.com") // 确保Email字段有索引
                     .First();</pre></div>
<p class="maodian"><a name="_label9"></a></p><h2>最佳实践</h2>
<p class="maodian"><a name="_lab2_9_27"></a></p><h3>1. 仓储模式实现</h3>
<div class="jb51code"><pre class="brush:csharp;">public interface IRepository&lt;T&gt; where T : class, new()
{
    Task&lt;T&gt; GetByIdAsync(object id);
    Task&lt;List&lt;T&gt;&gt; GetAllAsync();
    Task&lt;bool&gt; InsertAsync(T entity);
    Task&lt;bool&gt; UpdateAsync(T entity);
    Task&lt;bool&gt; DeleteAsync(object id);
}
public class Repository&lt;T&gt; : IRepository&lt;T&gt; where T : class, new()
{
    private readonly ISqlSugarClient _db;
    public Repository(ISqlSugarClient db)
    {
      _db = db;
    }
    public async Task&lt;T&gt; GetByIdAsync(object id)
    {
      return await _db.Queryable&lt;T&gt;().InSingleAsync(id);
    }
    public async Task&lt;List&lt;T&gt;&gt; GetAllAsync()
    {
      return await _db.Queryable&lt;T&gt;().ToListAsync();
    }
    public async Task&lt;bool&gt; InsertAsync(T entity)
    {
      return await _db.Insertable(entity).ExecuteCommandAsync() &gt; 0;
    }
    public async Task&lt;bool&gt; UpdateAsync(T entity)
    {
      return await _db.Updateable(entity).ExecuteCommandAsync() &gt; 0;
    }
    public async Task&lt;bool&gt; DeleteAsync(object id)
    {
      return await _db.Deleteable&lt;T&gt;().In(id).ExecuteCommandAsync() &gt; 0;
    }
}</pre></div>
<p class="maodian"><a name="_lab2_9_28"></a></p><h3>2. 依赖注入配置</h3>
<div class="jb51code"><pre class="brush:csharp;">// Startup.cs 或 Program.cs
services.AddSingleton&lt;ISqlSugarClient&gt;(provider =&gt;
{
    var config = new ConnectionConfig
    {
      ConnectionString = Configuration.GetConnectionString("DefaultConnection"),
      DbType = DbType.SqlServer,
      IsAutoCloseConnection = true,
      InitKeyType = InitKeyType.Attribute
    };
    var db = new SqlSugarClient(config);
    // 配置日志
    db.Aop.OnLogExecuting = (sql, pars) =&gt;
    {
      var logger = provider.GetService&lt;ILogger&lt;SqlSugarClient&gt;&gt;();
      logger.LogInformation($"SQL: {sql}");
    };
    return db;
});
services.AddScoped(typeof(IRepository&lt;&gt;), typeof(Repository&lt;&gt;));</pre></div>
<p class="maodian"><a name="_lab2_9_29"></a></p><h3>3. 配置管理</h3>
<div class="jb51code"><pre class="brush:csharp;">public class DatabaseOptions
{
    public string ConnectionString { get; set; }
    public string DbType { get; set; }
    public bool EnableLogging { get; set; }
    public int CommandTimeout { get; set; } = 30;
}
// appsettings.json
{
"Database": {
    "ConnectionString": "Server=.;Database=TestDB;Trusted_Connection=true;",
    "DbType": "SqlServer",
    "EnableLogging": true,
    "CommandTimeout": 60
}
}
// 配置使用
services.Configure&lt;DatabaseOptions&gt;(Configuration.GetSection("Database"));</pre></div>
<p class="maodian"><a name="_lab2_9_30"></a></p><h3>4. 异常处理</h3>
<div class="jb51code"><pre class="brush:csharp;">public class DatabaseExceptionHandler
{
    private readonly ILogger&lt;DatabaseExceptionHandler&gt; _logger;
    public DatabaseExceptionHandler(ILogger&lt;DatabaseExceptionHandler&gt; logger)
    {
      _logger = logger;
    }
    public async Task&lt;T&gt; ExecuteWithRetryAsync&lt;T&gt;(Func&lt;Task&lt;T&gt;&gt; operation, int maxRetries = 3)
    {
      for (int i = 0; i &lt; maxRetries; i++)
      {
            try
            {
                return await operation();
            }
            catch (Exception ex) when (i &lt; maxRetries - 1)
            {
                _logger.LogWarning($"数据库操作失败,正在重试... 第{i + 1}次,异常: {ex.Message}");
                await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, i))); // 指数退避
            }
      }
      return await operation(); // 最后一次尝试,如果失败则抛出异常
    }
}</pre></div>
<p class="maodian"><a name="_lab2_9_31"></a></p><h3>5. 单元测试</h3>
<div class="jb51code"><pre class="brush:csharp;">
public class UserRepositoryTests
{
    private ISqlSugarClient _db;
    private IRepository&lt;User&gt; _userRepository;
   
    public void Setup()
    {
      var config = new ConnectionConfig
      {
            ConnectionString = "测试数据库连接字符串",
            DbType = DbType.Sqlite,
            IsAutoCloseConnection = true
      };
      _db = new SqlSugarClient(config);
      _db.CodeFirst.InitTables&lt;User&gt;();
      _userRepository = new Repository&lt;User&gt;(_db);
    }
   
    public async Task InsertUser_ShouldReturnTrue()
    {
      // Arrange
      var user = new User { Name = "测试用户", Age = 25 };
      // Act
      var result = await _userRepository.InsertAsync(user);
      // Assert
      Assert.IsTrue(result);
      Assert.IsTrue(user.Id &gt; 0);
    }
   
    public void Cleanup()
    {
      _db?.Dispose();
    }
}</pre></div>
<p class="maodian"><a name="_label10"></a></p><h2>总结</h2>
<p>SqlSugar是一个功能强大、性能优异的.NET ORM框架,具有以下优势:</p>
<p class="maodian"><a name="_lab2_10_32"></a></p><h3>主要优点</h3>
<ol><li><strong>易于学习</strong>:简洁的API设计,完善的中文文档</li><li><strong>高性能</strong>:优化的SQL生成和执行机制</li><li><strong>功能丰富</strong>:支持多种数据库操作和高级功能</li><li><strong>灵活配置</strong>:支持多种配置方式和扩展点</li><li><strong>活跃社区</strong>:持续更新和维护,社区支持良好</li></ol>
<p class="maodian"><a name="_lab2_10_33"></a></p><h3>适用场景</h3>
<ul><li><strong>中小型项目</strong>:快速开发,简单易用</li><li><strong>高性能要求</strong>:批量操作,缓存支持</li><li><strong>多数据库环境</strong>:跨数据库平台开发</li><li><strong>国产化项目</strong>:支持国产数据库</li></ul>
<p class="maodian"><a name="_lab2_10_34"></a></p><h3>注意事项</h3>
<ol><li><strong>版本选择</strong>:根据项目需求选择合适的版本</li><li><strong>性能监控</strong>:合理使用日志和监控功能</li><li><strong>安全考虑</strong>:注意SQL注入防护和权限控制</li><li><strong>测试覆盖</strong>:编写充分的单元测试和集成测试</li></ol>
<p>SqlSugar为.NET开发者提供了一个优秀的数据访问解决方案,通过合理使用其功能特性,可以大大提高开发效率和应用性能。在实际项目中,建议结合具体业务需求,选择合适的功能和配置,以达到最佳的开发体验和运行效果。</p>
頁: [1]
查看完整版本: SqlSugar ORM框架安装配置使用详解