diff --git a/DOAN.Admin.WebApi/Program.cs b/DOAN.Admin.WebApi/Program.cs index e45488e..2f7b655 100644 --- a/DOAN.Admin.WebApi/Program.cs +++ b/DOAN.Admin.WebApi/Program.cs @@ -97,10 +97,11 @@ builder.Services.AddSwaggerConfig(); builder.Services.AddDirectoryBrowser(); var app = builder.Build(); +//全局配置 InternalApp.ServiceProvider = app.Services; InternalApp.Configuration = builder.Configuration; InternalApp.WebHostEnvironment = app.Environment; -//初始化db sqlsugar +//初始化db和 配置sqlsugar 然后注入IOC容器,然后AOP配置 builder.Services.AddDb(app.Environment); //使用全局异常中间件 diff --git a/DOAN.Admin.WebApi/appsettings.Development.json b/DOAN.Admin.WebApi/appsettings.Development.json index 51deb11..3d97140 100644 --- a/DOAN.Admin.WebApi/appsettings.Development.json +++ b/DOAN.Admin.WebApi/appsettings.Development.json @@ -14,6 +14,14 @@ "DbType": 0, //数据库类型 MySql = 0, SqlServer = 1, Oracle = 3,PgSql = 4 "ConfigId": "0", //多租户唯一标识 "IsAutoCloseConnection": true + }, + { + //"Conn": "Data Source=139.224.232.211;User ID=root;Password=doantech123;Initial Catalog=GXAssembly;Port=3308", + // "Conn": "Data Source=127.0.0.1;User ID=root;Password=123456;Initial Catalog=GXAssembly;Port=3306", + "Conn": "Data Source=192.168.0.58;User ID=root;Password=123456;Initial Catalog=GXAssembly;Port=3306", + "DbType": 0, //数据库类型 MySql = 0, SqlServer = 1, Oracle = 3,PgSql = 4 + "ConfigId": "1", //多租户唯一标识 + "IsAutoCloseConnection": true } //...下面添加更多的数据库源 ], diff --git a/DOAN.Repository/BaseRepository.cs b/DOAN.Repository/BaseRepository.cs index 5b2ac6f..11d2407 100644 --- a/DOAN.Repository/BaseRepository.cs +++ b/DOAN.Repository/BaseRepository.cs @@ -30,7 +30,7 @@ namespace DOAN.Repository public BaseRepository(ISqlSugarClient context = null) : base(context) { //通过特性拿到ConfigId - // C# 中使用反射来获取一个类型 (T) 上定义的自定义属性 (TenantAttribute) 的值。 + //这个方法会查找应用在类型 T 上的 TenantAttribute 自定义属性。如果找到了该属性,它将返回该属性的实例;如果没有找到 var configId = typeof(T).GetCustomAttribute()?.configId; if (configId != null) { diff --git a/DOAN.ServiceCore/SqlSugar/InitTable.cs b/DOAN.ServiceCore/SqlSugar/InitTable.cs index 4ef722c..0e66a2b 100644 --- a/DOAN.ServiceCore/SqlSugar/InitTable.cs +++ b/DOAN.ServiceCore/SqlSugar/InitTable.cs @@ -15,7 +15,8 @@ namespace DOAN.ServiceCore.SqlSugar /// public static void InitDb() { - var db = DbScoped.SugarScope; + var db = DbScoped.SugarScope.GetConnection(0); + //建库:如果不存在创建数据库存在不会重复创建 db.DbMaintenance.CreateDatabase();// 注意 :Oracle和个别国产库需不支持该方法,需要手动建库 diff --git a/DOAN.ServiceCore/SqlSugar/SqlsugarSetup.cs b/DOAN.ServiceCore/SqlSugar/SqlsugarSetup.cs index 9106a76..c539cbd 100644 --- a/DOAN.ServiceCore/SqlSugar/SqlsugarSetup.cs +++ b/DOAN.ServiceCore/SqlSugar/SqlsugarSetup.cs @@ -22,6 +22,7 @@ namespace DOAN.ServiceCore.SqlSugar var options = App.OptionsSetting; List dbConfigs = options.DbConfigs; + // 数据库连接配置 var iocList = new List(); foreach (var item in dbConfigs) { @@ -33,8 +34,11 @@ namespace DOAN.ServiceCore.SqlSugar IsAutoCloseConnection = item.IsAutoCloseConnection }); } + //SqlSugar.IOC 配置注入容器 SugarIocServices.AddSqlSugar(iocList); ICacheService cache = new SqlSugarCache(); + + // 配置参数 SugarIocServices.ConfigurationSugar(db => { var u = App.User; @@ -47,6 +51,7 @@ namespace DOAN.ServiceCore.SqlSugar iocList.ForEach(iocConfig => { + //数据库Aop设置 SetSugarAop(db, iocConfig, cache); }); }); @@ -68,30 +73,69 @@ namespace DOAN.ServiceCore.SqlSugar var config = db.GetConnectionScope(iocConfig.ConfigId).CurrentConnectionConfig; var showDbLog = AppSettings.Get("ShowDbLog"); string configId = config.ConfigId; + ////SQL执行前 db.GetConnectionScope(configId).Aop.OnLogExecuting = (sql, pars) => { + //if (showDbLog) + //{ + // string log = $"【db{configId} SQL】{UtilMethods.GetSqlString(config.DbType, sql, pars)}\n"; + // if (sql.TrimStart().StartsWith("SELECT", StringComparison.OrdinalIgnoreCase)) + // { + // logger.Info(log); + // } + // else if (sql.StartsWith("UPDATE", StringComparison.OrdinalIgnoreCase) || sql.StartsWith("INSERT", StringComparison.OrdinalIgnoreCase)) + // { + // logger.Warn(log); + // } + // else if (sql.StartsWith("DELETE", StringComparison.OrdinalIgnoreCase) || sql.StartsWith("TRUNCATE", StringComparison.OrdinalIgnoreCase)) + // { + // logger.Error(log); + // } + // else + // { + // log = $"【db{configId} SQL语句】dbo.{sql} {string.Join(", ", pars.Select(x => x.ParameterName + " = " + GetParsValue(x)))};\n"; + // logger.Info(log); + // } + // // 计算所需时间 + //} + }; + //SQL执行完 + db.GetConnectionScope(configId).Aop.OnLogExecuted = (sql, pars) => + { + + if (showDbLog) { + //执行完了可以输出SQL执行时间 (OnLogExecutedDelegate) + string spendTime = "\n 这个sql耗时" + db.Ado.SqlExecutionTime.TotalSeconds.ToString() + "秒"; string log = $"【db{configId} SQL】{UtilMethods.GetSqlString(config.DbType, sql, pars)}\n"; if (sql.TrimStart().StartsWith("SELECT", StringComparison.OrdinalIgnoreCase)) { - logger.Info(log); + logger.Info(log+ spendTime); + + } else if (sql.StartsWith("UPDATE", StringComparison.OrdinalIgnoreCase) || sql.StartsWith("INSERT", StringComparison.OrdinalIgnoreCase)) { - logger.Warn(log); + logger.Warn(log+ spendTime); + } else if (sql.StartsWith("DELETE", StringComparison.OrdinalIgnoreCase) || sql.StartsWith("TRUNCATE", StringComparison.OrdinalIgnoreCase)) { - logger.Error(log); + logger.Error(log + spendTime); + } else { log = $"【db{configId} SQL语句】dbo.{sql} {string.Join(", ", pars.Select(x => x.ParameterName + " = " + GetParsValue(x)))};\n"; - logger.Info(log); + logger.Info(log+ spendTime); + } + } }; + + // SQL报错 db.GetConnectionScope(configId).Aop.OnError = (ex) => { //var pars = db.Utilities.SerializeObject(((SugarParameter[])ex.Parametres).ToDictionary(it => it.ParameterName, it => it.Value)); @@ -99,9 +143,13 @@ namespace DOAN.ServiceCore.SqlSugar string sql = "【错误SQL】" + UtilMethods.GetSqlString(config.DbType, ex.Sql, (SugarParameter[])ex.Parametres) + "\r\n"; logger.Error(ex, $"{sql}\r\n{ex.Message}\r\n{ex.StackTrace}"); }; + + db.GetConnectionScope(configId).Aop.DataExecuting = (oldValue, entiyInfo) => { }; + + //差异日志功能 db.GetConnectionScope(configId).Aop.OnDiffLogEvent = it => {