|  | @@ -23,9 +23,7 @@ namespace Admin.Core.Repository
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              if (appConfig.Tenant && user.DataIsolationType == DataIsolationType.OwnDb)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                var tenantName = "tenant_" + user.TenantId?.ToString();
 | 
	
		
			
				|  |  | -                ib.TryRegister(tenantName, () => CreateFreeSql(user, appConfig, serviceProvider));
 | 
	
		
			
				|  |  | -                return ib.Get(tenantName);
 | 
	
		
			
				|  |  | +                return RegisterAndGetFreeSql(ib, user, appConfig, serviceProvider);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              else
 | 
	
		
			
				|  |  |              {
 | 
	
	
		
			
				|  | @@ -35,70 +33,80 @@ namespace Admin.Core.Repository
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  | -        /// 创建FreeSql实例
 | 
	
		
			
				|  |  | +        /// 注册并获得FreeSql实例
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
		
			
				|  |  |          /// <param name="user"></param>
 | 
	
		
			
				|  |  |          /// <param name="appConfig"></param>
 | 
	
		
			
				|  |  |          /// <param name="serviceProvider"></param>
 | 
	
		
			
				|  |  |          /// <returns></returns>
 | 
	
		
			
				|  |  | -        private static IFreeSql CreateFreeSql(IUser user, AppConfig appConfig, IServiceProvider serviceProvider)
 | 
	
		
			
				|  |  | +        private static IFreeSql RegisterAndGetFreeSql(IdleBus<IFreeSql> ib, IUser user, AppConfig appConfig, IServiceProvider serviceProvider)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            var dbConfig = serviceProvider.GetRequiredService<DbConfig>();
 | 
	
		
			
				|  |  | +            var tenantName = "tenant_" + user.TenantId?.ToString();
 | 
	
		
			
				|  |  | +            var exists = ib.Exists(tenantName);
 | 
	
		
			
				|  |  | +            if (!exists)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                var dbConfig = serviceProvider.GetRequiredService<DbConfig>();
 | 
	
		
			
				|  |  | +                //查询租户数据库信息
 | 
	
		
			
				|  |  | +                var freeSql = serviceProvider.GetRequiredService<IFreeSql>();
 | 
	
		
			
				|  |  | +                var tenantRepository = freeSql.GetRepository<TenantEntity>();
 | 
	
		
			
				|  |  | +                var tenant = tenantRepository.Select.DisableGlobalFilter("Tenant").WhereDynamic(user.TenantId).ToOne(a => new { a.DbType, a.ConnectionString, a.IdleTime });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            //查询租户数据库信息
 | 
	
		
			
				|  |  | -            var freeSql = serviceProvider.GetRequiredService<IFreeSql>();
 | 
	
		
			
				|  |  | -            var tenantRepository = freeSql.GetRepository<TenantEntity>();
 | 
	
		
			
				|  |  | -            var tenant = tenantRepository.Select.DisableGlobalFilter("Tenant").WhereDynamic(user.TenantId).ToOne(a => new { a.DbType, a.ConnectionString });
 | 
	
		
			
				|  |  | +                var timeSpan = tenant.IdleTime.HasValue && tenant.IdleTime.Value > 0 ? TimeSpan.FromMinutes(tenant.IdleTime.Value) : TimeSpan.MaxValue;
 | 
	
		
			
				|  |  | +                ib.TryRegister(tenantName, () =>
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    var freeSqlBuilder = new FreeSqlBuilder()
 | 
	
		
			
				|  |  | +                        .UseConnectionString(tenant.DbType.Value, tenant.ConnectionString)
 | 
	
		
			
				|  |  | +                        .UseAutoSyncStructure(false)
 | 
	
		
			
				|  |  | +                        .UseLazyLoading(false)
 | 
	
		
			
				|  |  | +                        .UseNoneCommandParameter(true);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            var freeSqlBuilder = new FreeSqlBuilder()
 | 
	
		
			
				|  |  | -                    .UseConnectionString(tenant.DbType.Value, tenant.ConnectionString)
 | 
	
		
			
				|  |  | -                    .UseAutoSyncStructure(false)
 | 
	
		
			
				|  |  | -                    .UseLazyLoading(false)
 | 
	
		
			
				|  |  | -                    .UseNoneCommandParameter(true);
 | 
	
		
			
				|  |  | +                    #region 监听所有命令
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            #region 监听所有命令
 | 
	
		
			
				|  |  | +                    if (dbConfig.MonitorCommand)
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
 | 
	
		
			
				|  |  | +                        {
 | 
	
		
			
				|  |  | +                            Console.WriteLine($"{cmd.CommandText}\r\n");
 | 
	
		
			
				|  |  | +                        });
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if (dbConfig.MonitorCommand)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    Console.WriteLine($"{cmd.CommandText}\r\n");
 | 
	
		
			
				|  |  | -                });
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | +                    #endregion 监听所有命令
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            #endregion 监听所有命令
 | 
	
		
			
				|  |  | +                    var fsql = freeSqlBuilder.Build();
 | 
	
		
			
				|  |  | +                    fsql.GlobalFilter.Apply<IEntitySoftDelete>("SoftDelete", a => a.IsDeleted == false);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            var fsql = freeSqlBuilder.Build();
 | 
	
		
			
				|  |  | -            fsql.GlobalFilter.Apply<IEntitySoftDelete>("SoftDelete", a => a.IsDeleted == false);
 | 
	
		
			
				|  |  | +                    //配置实体
 | 
	
		
			
				|  |  | +                    DbHelper.ConfigEntity(fsql, appConfig);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            //配置实体
 | 
	
		
			
				|  |  | -            DbHelper.ConfigEntity(fsql, appConfig);
 | 
	
		
			
				|  |  | +                    #region 监听Curd操作
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            #region 监听Curd操作
 | 
	
		
			
				|  |  | +                    if (dbConfig.Curd)
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        fsql.Aop.CurdBefore += (s, e) =>
 | 
	
		
			
				|  |  | +                        {
 | 
	
		
			
				|  |  | +                            Console.WriteLine($"{e.Sql}\r\n");
 | 
	
		
			
				|  |  | +                        };
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if (dbConfig.Curd)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                fsql.Aop.CurdBefore += (s, e) =>
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    Console.WriteLine($"{e.Sql}\r\n");
 | 
	
		
			
				|  |  | -                };
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | +                    #endregion 监听Curd操作
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            #endregion 监听Curd操作
 | 
	
		
			
				|  |  | +                    #region 审计数据
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            #region 审计数据
 | 
	
		
			
				|  |  | +                    //计算服务器时间
 | 
	
		
			
				|  |  | +                    var serverTime = fsql.Select<DualEntity>().Limit(1).First(a => DateTime.UtcNow);
 | 
	
		
			
				|  |  | +                    var timeOffset = DateTime.UtcNow.Subtract(serverTime);
 | 
	
		
			
				|  |  | +                    fsql.Aop.AuditValue += (s, e) =>
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        DbHelper.AuditValue(e, timeOffset, user);
 | 
	
		
			
				|  |  | +                    };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            //计算服务器时间
 | 
	
		
			
				|  |  | -            var serverTime = fsql.Select<DualEntity>().Limit(1).First(a => DateTime.UtcNow);
 | 
	
		
			
				|  |  | -            var timeOffset = DateTime.UtcNow.Subtract(serverTime);
 | 
	
		
			
				|  |  | -            fsql.Aop.AuditValue += (s, e) =>
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                DbHelper.AuditValue(e, timeOffset, user);
 | 
	
		
			
				|  |  | -            };
 | 
	
		
			
				|  |  | +                    #endregion 审计数据
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            #endregion 审计数据
 | 
	
		
			
				|  |  | +                    return fsql;
 | 
	
		
			
				|  |  | +                }, timeSpan);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            return fsql;
 | 
	
		
			
				|  |  | +            return ib.Get(tenantName);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 |