OpenAuth.Net/newdocs/docs/notes/core/sqlsugar.md

3.6 KiB
Raw Blame History

title createTime permalink
SqlSugar集成 2025/04/23 21:03:10 /core/sqlsugar/

SqlSugar 是一款老牌.NET开源ORM框架相对于EntityFramework复杂的Linq表达式它拥有灵活的动态查询如果你喜欢直接码Sql那么它是你的不二之选。OpenAuth.Net 6.0及以后版本默认支持使用SqlSugar方式访问数据库。

框架提供SqlSugarBaseApp基类该基类定义了SqlSugar最常用的两个成员变量

protected ISqlSugarClient SugarClient; //SqlSugar基础数据库读写
protected SqlSugarRepository<T> Repository; //SqlSugar的仓储模式

只需要继承该基类即可使用SqlSugar的强大功能。

目前框架大多数模块都已继承SqlSugarBaseApp基类,这里以资源管理为例:

public class ResourceApp:SqlSugarBaseApp<SysResource>
    {
        public void Add(AddOrUpdateResReq resource)
        {
            ...
            Repository.Insert(obj);
        }

        public void Update(AddOrUpdateResReq obj)
        {
            Repository.Update(u => new SysResource
            {
                Name = obj.Name,
                //todo:要修改的字段赋值
            },u => u.Id == obj.Id);
        }
       
        public void Delete(string[] ids)
        {
            Repository.DeleteByIds(ids);
        }

        public ResourceApp(ISqlSugarClient client, IAuth auth) : base(client, auth)
        {
        }

    }

使用方法

当编写业务代码需要使用SqlSugar的模块时只需要继承SqlSugarBaseApp即可使用SqlSugar强大功能。其中

Repository

实现的是SqlSugar的仓储模式详细Api请查看SqlSugar使用仓储。在OpenAuth.Net中

public class ResourceApp:SqlSugarBaseApp<SysResource>
    {
        public void Add(AddOrUpdateResReq resource)
        {
            ...
            Repository.Insert(obj);
        }
    }

SugarClient

SqlSugar基础数据库读写用法。详细Api请查看SqlSugar入门必看。在OpenAuth.Net中

public class ResourceApp:SqlSugarBaseApp<SysResource>
    {
        public List<SysResource> Load()
        {
            ...
            return SugarClient.Queryable<SysResource>().ToList();
        }
    }

事务

SqlSugar提供了强大的事务功能在OpenAuth.Net中只需要在业务开始时调用SugarClient.Ado.BeginTran()开启事务,在业务结束时,调用SugarClient.Ado.CommitTran()提交事务,即可使用事务。

比如一个复杂的主从表业务无论中间过程使用的是SugarClient还是Repository都可以用这种方式来实现事务

SugarClient.Ado.BeginTran();

// 更新从表中的字段
if (obj.SubTableReqs != null && obj.SubTableReqs.Any())
{
    //id比数据库少的删除
    var containids = obj.SubTableReqs.Select(u => u.Id)
        .Where(u => !string.IsNullOrEmpty(u)).ToList();
    if (containids.Any())
    {
        SugarClient.Deleteable<SubTable>(u => !containids.Contains(u.Id) && u.MainTableId == obj.Id).ExecuteCommand();
    }

    //id为空时添加
    foreach (var detail in obj.SubTableReqs.Where(u => string.IsNullOrEmpty(u.Id)))
    {
        _subTableApp.Add(detail);
    }

    //更新id相同的
    foreach (var detail in obj.SubTableReqs.Where(u => !string.IsNullOrEmpty(u.Id)))
    {
        _subTableApp.Update(detail);
    }
}

// 更新主表中的字段
Repository.Update(u => new MainTable
{
    NeedUpdateField = obj.NeedUpdateField,
    //todo:补充或调整自己需要的字段
}, u => u.Id == obj.Id);

SugarClient.Ado.CommitTran();