.Net6基础功能封装分享7(ORM框架Sqlsugar集成)
在.netcore中有很多优秀的ORM开源框架,我选择了集成Sqlsugar,Sqlsugar的优点很多,我就不在这里详述了,最让我中意的还是Sqlsugar在文档方面我觉得是做的最好的,必须给作者点赞。
首先当然还是下载SqlSugarCore依赖包啦
然后编写数据源配置对象和在配置文件中增加配置
编写增加sqlSugar的扩展方法(获取配置源、创建创建sqlclient对象、增加sql语句执行日志拦截器、sql异常拦截器、插入和更新拦截器、将SqlSugarClient对象以单例模式注入到IServiceCollection容器中、启动连接验证等)
public static IServiceCollection AddDataSource(this IServiceCollection services, IConfiguration configuration)
{
//获取数据源配置
DataSourceConfig dataSource = configuration.GetT();
DbContext.SetDataSourceConfig(dataSource);
if (dataSource == null)
{
NLogger.Default.Error("获取数据库连接配置错误");
return services;
}
DbType dbType = (DbType)Enum.Parse(typeof(DbType), dataSource.DbType);
//创建SqlSugarClient对象
SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig()
{
ConfigId= "default",
DbType = dbType,
IsAutoCloseConnection = true,
ConnectionString = dataSource.ConnectionString,
},
db =>
{
//增加sql语句执行日志
db.Aop.OnLogExecuting = (sqlStr, pms) =>
{
if (dataSource.IsPrintSqlLog)
{
NLogger.Default.Info($"执行sql语句:{UtilMethods.GetNativeSql(sqlStr, pms)}");
}
};
//异常
db.Aop.OnError = (ex) =>
{
NLogger.Default.Error("==============执行sql错误==============");
if (ex.Parametres == null)
{
NLogger.Default.Error(ex.Sql);
}
else
{
SugarParameter[] param = ex.Parametres as SugarParameter[];
NLogger.Default.Error(UtilMethods.GetNativeSql(ex.Sql, param));
}
};
//插入和更新过滤器
db.Aop.DataExecuting = (oldValue, entityInfo) =>
{
// 新增操作
if (entityInfo.OperationType == DataFilterType.InsertByObject)
{
// 主键(long类型)且没有值的---赋值雪花Id
if (entityInfo.EntityColumnInfo.IsPrimarykey && entityInfo.EntityColumnInfo.PropertyInfo.PropertyType == typeof(long))
{
var id = entityInfo.EntityColumnInfo.PropertyInfo.GetValue(entityInfo.EntityValue);
if (id == null || (long)id == 0)
{
entityInfo.SetValue(CommonUtils.GetSingleId());
}
}
if (entityInfo.PropertyName == nameof(BaseEntity.CreateTime))
{
entityInfo.SetValue(DateTime.Now);
}
//if (App.User != null)
//{
// //创建人和创建机构ID
// if (entityInfo.PropertyName == nameof(BaseEntity.CreateUserId))
// {
// entityInfo.SetValue(App.User.FindFirst(ClaimConst.UserId)?.Value);
// }
// if (entityInfo.PropertyName == nameof(BaseEntity.CreateUser))
// {
// entityInfo.SetValue(App.User?.FindFirst(ClaimConst.Account)?.Value);
// }
// if (entityInfo.PropertyName == nameof(DataEntityBase.CreateOrgId))
// {
// entityInfo.SetValue(App.User.FindFirst(ClaimConst.OrgId)?.Value);
// }
//}
}
// 更新操作
if (entityInfo.OperationType == DataFilterType.UpdateByObject)
{
//更新时间
if (entityInfo.PropertyName == nameof(BaseEntity.UpdateTime))
{
entityInfo.SetValue(DateTime.Now);
}
//更新人
//if (App.User != null)
//{
// if (entityInfo.PropertyName == nameof(BaseEntity.UpdateUserId))
// {
// entityInfo.SetValue(App.User?.FindFirst(ClaimConst.UserId)?.Value);
// }
// if (entityInfo.PropertyName == nameof(BaseEntity.UpdateUser))
// {
// entityInfo.SetValue(App.User?.FindFirst(ClaimConst.Account)?.Value);
// }
//}
}
};
});
services.AddSingleton(sqlSugar);//这边是SqlSugarScope用AddSingleton
DbContext.SetClient(sqlSugar);
Task.Run(() =>
{
bool success = sqlSugar.Ado.IsValidConnection();
if (success)
{
NLogger.Default.Info("[数据库连接测试]:数据库连接成功");
}
else
{
NLogger.Default.Error("[数据库连接测试]:数据库连接失败");
}
});
return services;
}
在Program启动类中,执行增加数据源的扩展方法
为了业务中操作方便和符合自己的使用习惯,使用了仓储模式,编写仓储类,继承SimpleClient,可以自己增加共用的仓储扩展方法
在业务的数据访问层中创建dao对象,继承仓储类,就能使用sqlSugar中提供的方法,操作数据库表了,在Dao类中也有三种方式使用ISqlSugarClient对象