• ABP集成SqlSugar


    SqlSugar是一款老牌 .NET 开源多库架构ORM框架,由果糖大数据科技团队维护和更新 ,生态圈丰富 ,开箱即用最易上手。
    请添加图片描述

    在host,core,app层添加SqlSugarCore

    在Startup.ConfigureServices中注册SqlSugarClient和SqlSugarRepository

    //注册上下文:AOP里面可以获取IOC对象,如果有现成框架比如Furion可以不写这一行
    services.AddHttpContextAccessor();
    //注册SqlSugar
    services.AddSingleton<ISqlSugarClient>(s =>
    {
    	SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig()
    	{
    		DbType = SqlSugar.DbType.SqlServer,
    		ConnectionString = _appConfiguration.GetConnectionString("Default"),//"Server=.\\SQL16; Database=MaikeABPStudy; Uid=sa; Pwd=123456;",
    		IsAutoCloseConnection = true,
    	},
       db =>
       {
    	   //自动过滤软删除
    	   db.QueryFilter.AddTableFilter<ISoftDelete>(it => it.IsDeleted == false);
    	   //自动过滤租户
    	   db.QueryFilter.AddTableFilter<IMustHaveTenant>(it =>
    			it.TenantId == IocManager.Instance.IocContainer.Resolve<IAbpSession>().TenantId);
    
    	   db.Aop.DataExecuting = (_, entityInfo) =>
    	   {
    		   switch (entityInfo.OperationType)
    		   {
    			   //执行insert时
    			   case DataFilterType.InsertByObject:
    				   //自动设置主键: 雪花id,单号
    				   if (entityInfo.EntityColumnInfo.IsPrimarykey)
    				   {
    					   //var obj = (IEntity)entityInfo.EntityValue;
    					   //obj.Id = YitIdHelper.NextId();
    				   }
    				   //自动设置时间和操作人
    				   if (entityInfo.EntityValue is ICreationAudited)
    				   {
    					   var session = IocManager.Instance.IocContainer.Resolve<IAbpSession>();
    					   var obj = (ICreationAudited)entityInfo.EntityValue;
    					   obj.CreationTime = DateTime.Now;
    					   obj.CreatorUserId = session.UserId;
    				   }
    				   //自动设置租户
    				   if (entityInfo.EntityValue is IMustHaveTenant)
    				   {
    					   var session = IocManager.Instance.IocContainer.Resolve<IAbpSession>();
    					   var obj = (IMustHaveTenant)entityInfo.EntityValue;
    					   obj.TenantId = session.TenantId.Value;
    				   }
    				   break;
    			   case DataFilterType.UpdateByObject:
    				   //自动设置时间和操作人
    				   if (entityInfo.EntityValue is IModificationAudited)
    				   {
    					   var session = IocManager.Instance.IocContainer.Resolve<IAbpSession>();
    					   var obj = (IModificationAudited)entityInfo.EntityValue;
    					   obj.LastModificationTime = DateTime.Now;
    					   obj.LastModifierUserId = session.UserId;
    				   }
    				   break;
    			   case DataFilterType.DeleteByObject:
    				   //自动设置时间和操作人
    				   if (entityInfo.EntityValue is IDeletionAudited)
    				   {
    					   var session = IocManager.Instance.IocContainer.Resolve<IAbpSession>();
    					   var obj = (IDeletionAudited)entityInfo.EntityValue;
    					   obj.DeletionTime = DateTime.Now;
    					   obj.DeleterUserId = session.UserId;
    				   }
    				   break;
    		   }
    	   };
    	   db.Aop.OnLogExecuting = (sql, pars) =>
    	   {
    		   LogHelper.Logger.Fatal(UtilMethods.GetSqlString(db.CurrentConnectionConfig.DbType, sql, pars));
    	   };
    	   db.Aop.OnError = ex =>
    	   {
    		   if (ex.Parametres == null)
    		   {
    			   LogHelper.Logger.Fatal(ex.Sql);
    		   }
    		   else
    		   {
    			   LogHelper.Logger.Fatal(UtilMethods.GetSqlString(db.CurrentConnectionConfig.DbType, ex.Sql, (SugarParameter[])ex.Parametres));
    		   }
    	   };
       });
    	return sqlSugar;
    });
    //注册SqlSugar仓储
    services.AddScoped(typeof(ISqlSugarRepository<>), typeof(SqlSugarRepository<>));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89

    在CORE层添加SqlSugar仓储接口和实现

    接口

    public interface ISqlSugarRepository<T> : ISimpleClient<T> where T : class, new()
    {
    	ISqlSugarClient Context { get; set; }
        ISugarQueryable<T> Queryable { get; }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    实现

    /// 
    /// 基础仓储类
    /// 
    public class SqlSugarRepository<T> : SimpleClient<T>, ISqlSugarRepository<T> where T : class, new()
    {
        public SqlSugarRepository(ISqlSugarClient context = null) : base(context)
        {
        }
    	
        public ISugarQueryable<T> Queryable
        {
            get
            {
                return Context.Queryable<T>();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在应用层注入使用

    private ISqlSugarRepository<XXXEntity> _sqlsugarRepository;
    
    //使用
    var obj = _sqlsugarRepository.Queryable.First() ;
    
    • 1
    • 2
    • 3
    • 4

    备用代码:furion框架中sqlsugar的日志记录

    db.Aop.OnLogExecuting = (sql, pars) =>
    {
    	var originColor = Console.ForegroundColor;
    	if (sql.StartsWith("SELECT", StringComparison.OrdinalIgnoreCase))
    		Console.ForegroundColor = ConsoleColor.Green;
    	if (sql.StartsWith("UPDATE", StringComparison.OrdinalIgnoreCase) || sql.StartsWith("INSERT", StringComparison.OrdinalIgnoreCase))
    		Console.ForegroundColor = ConsoleColor.Yellow;
    	if (sql.StartsWith("DELETE", StringComparison.OrdinalIgnoreCase))
    		Console.ForegroundColor = ConsoleColor.Red;
    	UtilMethods.GetSqlString(config.DbType, sql, pars).LogCritical();
    	//Console.WriteLine("【" + DateTime.Now + "——执行SQL】\r\n" + UtilMethods.GetSqlString(config.DbType, sql, pars) + "\r\n");
    	//Console.ForegroundColor = originColor;
    	//打印到swagger
    	App.PrintToMiniProfiler("SqlSugar", "Info", sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
    };
    db.Aop.OnError = ex =>
    {
    	if (ex.Parametres == null) return;
    	var originColor = Console.ForegroundColor;
    	Console.ForegroundColor = ConsoleColor.DarkRed;
    	var pars = db.Utilities.SerializeObject(((SugarParameter[])ex.Parametres).ToDictionary(it => it.ParameterName, it => it.Value));
    	var log = "【SQL错误】\r\n" + UtilMethods.GetSqlString(config.DbType, ex.Sql, (SugarParameter[])ex.Parametres);
    	log += ex.ToString();
    	log.SetCategory<SqlSugarCache>().LogCritical();
    	//Console.WriteLine("【" + DateTime.Now + "——错误SQL】\r\n" + UtilMethods.GetSqlString(config.DbType, ex.Sql, (SugarParameter[])ex.Parametres) + "\r\n");
    	//Console.ForegroundColor = originColor;
    	//打印到swagger
    	App.PrintToMiniProfiler("SqlSugar", "Error", $"{ex.Message}{Environment.NewLine}{ex.Sql}{pars}{Environment.NewLine}");
    };
    db.Aop.OnLogExecuted = (sql, pars) =>
    {
    	// 执行时间超过5秒
    	if (db.Ado.SqlExecutionTime.TotalSeconds > 5)
    	{
    		var fileName = db.Ado.SqlStackTrace.FirstFileName; // 文件名
    		var fileLine = db.Ado.SqlStackTrace.FirstLine; // 行号
    		var firstMethodName = db.Ado.SqlStackTrace.FirstMethodName; // 方法名
    		var totalSeconds = db.Ado.SqlExecutionTime.TotalSeconds; // 方法名
    		var log = $"【所在文件名】:{fileName}\r\n【代码行数】:{fileLine}\r\n【方法名】:{firstMethodName}\r\n【执行时长】:{totalSeconds}\r\n" + $"【sql语句】:{UtilMethods.GetSqlString(config.DbType, sql, pars)}";
    		log.SetCategory<SqlSugarUnitOfWork>().LogInformation();  // 日志名字,借用SqlSugarUnitOfWork来标记执行时间过长的脚本
    		//var originColor = Console.ForegroundColor;
    		//Console.ForegroundColor = ConsoleColor.DarkYellow;
    		//Console.WriteLine(log);
    		//Console.ForegroundColor = originColor;
    	}
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    // 日志写入文件
    if (App.GetConfig<bool>("Logging:File:Enabled"))
    {
    	Array.ForEach(new[] { LogLevel.Information, LogLevel.Warning, LogLevel.Error, LogLevel.Critical }, logLevel =>
    	{
    		services.AddFileLogging("logs/{0:yyyy}{0:MM}{0:dd}/{1}-{0:HH}.log", options =>
    		{
    			options.DateFormat = "yyyy-MM-dd HH:mm:ss";
    			if (LogLevel.Critical == logLevel)
    			{
    				options.FileNameRule = fileName => string.Format(fileName, DateTime.Now, "Sql");
    			}
    			else
    			{
    				options.FileNameRule = fileName => string.Format(fileName, DateTime.Now, logLevel.ToString());
    			}
    
    			//options.WithTraceId = true; // 显示线程Id
    			//options.WithStackFrame = true; // 显示程序集
    			options.WriteFilter = logMsg => logMsg.LogLevel == logLevel; // 日志级别
    			options.HandleWriteError = (writeError) => // 写入失败时启用备用文件
    			{
    				writeError.UseRollbackFileName(Path.GetFileNameWithoutExtension(writeError.CurrentFileName) + "-oops" + Path.GetExtension(writeError.CurrentFileName));
    			};
    		});
    
    		services.AddFileLogging("logs/{0:yyyy}{0:MM}{0:dd}/{1}-{0:HH}.log", options =>
    		{
    			options.DateFormat = "yyyy-MM-dd HH:mm:ss";
    			options.FileNameRule = fileName => string.Format(fileName, DateTime.Now, "SqlLongTime");
    			options.WriteFilter = logMsg => logMsg.LogLevel == LogLevel.Information && logMsg.LogName.Contains("SqlSugarUnitOfWork"); // 日志名字,借用SqlSugarUnitOfWork来标记执行时间过长的脚本
    		});
    	});
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
  • 相关阅读:
    用汇编来理解堆栈
    聚N-乙烯基乙酰胺接枝丙烯腈/苯乙烯聚合物微球PNVA-g-PAN/PSt的制备与表征过程
    尚硅谷_SpringMVC笔记
    adb 命令速查(下)
    上手Python之函数进阶
    关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?
    自己使用过的Python(Win64位)各版本及相关工具百度网盘下载链接汇总
    周热点回顾(6.13-6.19)
    java毕业设计爱宠医院管理系统mybatis+源码+调试部署+系统+数据库+lw
    如何使用ChatGPT,而不是生成默认风格的八股文
  • 原文地址:https://blog.csdn.net/zheyiw/article/details/133045602