SqlSugar 是一款 老牌 .NET 开源多库架构ORM框架(EF Core单库架构),由果糖大数据科技团队
维护和更新 ,开箱即用最易上手的.NET ORM框架 。生态圈丰富,目前开源生态仅次于EF Core,但是在需要
多库兼容的项目或产品中更加偏爱SqlSugar
Github源码:https://github.com/donet5/SqlSugar
Gitee源码:https://gitee.com/dotnetchina/SqlSugar
DAO层的封装
BaseDAO
using SqlSugar;
using System.Configuration;
namespace Api.DAO
{
public class BaseDAO
{
/// <summary>
/// 数据库连接类型
/// </summary>
protected SqlSugar.DbType _defaultDBType = SqlSugar.DbType.MySql;
protected string _defaultConnString = ConfigurationManager.AppSettings["MySQLConnection"].ToString();
/// <summary>
/// 数据库
/// </summary>
public ISqlSugarClient DB { get; private set; }
/// <summary>
/// 数据库连接属性
/// 用于使用事务时的连接参数传递
/// </summary>
public IAdo DBAdaptor
{
get { return DB.Ado; }
}
#region 默认数据库连接
/// <summary>
/// 使用默认的数据库类型和已知连接初始化DB
/// </summary>
/// <param name="dbType"></param>
/// <param name="connKey"></param>
public BaseDAO(IAdo ado = null)
{
if (ado == null)
{
this.DB = new SqlSugarProvider(new ConnectionConfig()
{
ConnectionString = _defaultConnString,
DbType = _defaultDBType,
IsAutoCloseConnection = true,
});
}
else
{
this.DB = ado.Context;
}
}
#endregion
#region 自定义数据库连接
/// <summary>
/// 使用自定义数据库类型和连接字符串初始化
/// <para>
/// 适用于自定义数据库连接(例如业务中连接第二种数据库)
/// </para>
/// </summary>
/// <param name="dbType"></param>
/// <param name="connKey"></param>
public BaseDAO(SqlSugar.DbType dbType, string connString)
{
_defaultDBType = dbType;
_defaultConnString = connString;
this.DB = new SqlSugarProvider(new ConnectionConfig()
{
ConnectionString = _defaultConnString,
DbType = _defaultDBType,
IsAutoCloseConnection = true,
});
}
#endregion
}
}
增删查改的操作,以ConfigDAO为例子:
/// <summary>
/// 系统配置数据
/// </summary>
public class ConfigDAO : BaseDAO
{
public ConfigDAO(IAdo ado = null) : base(ado) { }
/// <summary>
/// 查询所有的配置数据
/// </summary>
/// <returns></returns>
public IEnumerable<t_sys_config> GetAllConfig()
{
var sql = base.DB.Queryable<t_sys_config>();
return sql.ToList();
}
/// <summary>
/// 获取配置数据列表
/// </summary>
/// <param name="parent">父节点编码,默认根节点root</param>
/// <param name="cfgCode">配置项编码</param>
/// <returns></returns>
public IEnumerable<t_sys_config> GetConfigList(string parent, string cfgCode="")
{
if (string.IsNullOrEmpty(parent))
{
//父节点为空时,默认取根节点数据
parent = "root";
}
var sql = base.DB.Queryable<t_sys_config>();
sql = sql.Where(t => t.ParentCode == parent);
if (!string.IsNullOrEmpty(cfgCode))
{
sql = sql.Where(t => t.CfgCode == cfgCode);
}
return sql.ToList();
}
/// <summary>
/// 获取配置信息
/// </summary>
/// <param name="cfgCode">配置编码</param>
/// <returns></returns>
public t_sys_config GetConfig(string cfgCode)
{
var sql = base.DB.Queryable<t_sys_config>().Where(t => t.CfgCode == cfgCode);
return sql.Single();
}
/// <summary>
/// 新增前检测 true-正常,可新增 false-已存在相同数据
/// </summary>
/// <param name="cfgCode">配置编码</param>
/// <returns></returns>
public BaseResult CheckBeforeInsert(string cfgCode)
{
var sql = base.DB.Queryable<t_sys_config>().Where(t => t.CfgCode == cfgCode);
return sql.Count() <= 0;
}
/// <summary>
/// 新增配置数据
/// 正常系统中不进行使用,配置需要脚本初始化
/// </summary>
/// <param name="entity">配置数据</param>
/// <returns></returns>
public BaseResult Insert(t_sys_config entity)
{
var sql = base.DB.Insertable(entity);
return sql.ExecuteCommand() > 0;
}
/// <summary>
/// 修改配置数据
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public BaseResult Update(t_sys_config entity)
{
var sql = base.DB.Updateable(entity).Where(x => x.CfgCode == entity.CfgCode);
return sql.ExecuteCommand() > 0;
}
}
事务处理:
/// <summary>
/// 新增完整的订单数据
/// </summary>
/// <param name="model">订单数据</param>
/// <param name="products">订单明细数据</param>
/// <param name="userCode">操作人用户编码</param>
/// <returns></returns>
public BaseResult InsertOrder(OrderModel model, List<OrderProductModel> products, string userCode)
{
BaseResult result = BaseResult.Successed;
OrderDAO dao=new OrderDAO();
try
{
DateTime now = DateTime.Now;
//数据检测
t_order entity = new t_order();
MapHelper.Map(model, entity);
entity.CreateTime = now;
entity.CreateUserCode = userCode;
entity.ModifyTime = now;
entity.ModifyUserCode = userCode;
if (string.IsNullOrEmpty(entity.ID))
{
entity.ID = GetGuid();
}
string errormsg = Entity.DataValidation.Validate(entity);
if (!string.IsNullOrEmpty(errormsg))
{
return new BaseResult(false, errormsg);
}
if (!dao.CheckBeforeInsert(entity.OrderId))
{
return new BaseResult(false, $"订单[{entity.OrderId}]已存在");
}
var _group = products.GroupBy(x => x.MaterialCode);
if (_group.Count() != products.Count)
{
result = new BaseResult(false, "订单明细中存在重复的物料");
return result;
}
//开启事务
dao.DBAdaptor.BeginTran();
//新增数据
var res = dao.Insert(entity);
if(!res)
{
dao.DBAdaptor.RollbackTran();
return res;
}
OrderProductBLL productBLL = new OrderProductBLL();
foreach (var product in products)
{
//dao.DBAdaptor - 数据库连接传递,包括事务状态
res = productBLL.Insert(product, userCode, dao.DBAdaptor);
if (!res)
{
dao.DBAdaptor.RollbackTran();
return res;
}
}
//提交事务
dao.DBAdaptor.CommitTran();
}
catch(Exception ex)
{
if(dao.DBAdaptor.IsAnyTran())
{
dao.DBAdaptor.RollbackTran();
}
throw ex;
}
return result;
}