|  | @@ -17,155 +17,125 @@ namespace ZhonTai.Admin.Core.Db;
 | 
	
		
			
				|  |  |  public static class DBServiceCollectionExtensions
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      /// <summary>
 | 
	
		
			
				|  |  | -    /// 添加数据库
 | 
	
		
			
				|  |  | +    /// 添加主数据库
 | 
	
		
			
				|  |  |      /// </summary>
 | 
	
		
			
				|  |  |      /// <param name="services"></param>
 | 
	
		
			
				|  |  | +    /// <param name="freeSqlCloud"></param>
 | 
	
		
			
				|  |  |      /// <param name="env"></param>
 | 
	
		
			
				|  |  |      /// <param name="hostAppOptions"></param>
 | 
	
		
			
				|  |  |      /// <returns></returns>
 | 
	
		
			
				|  |  | -    public async static Task AddDbAsync(this IServiceCollection services, IHostEnvironment env, HostAppOptions hostAppOptions)
 | 
	
		
			
				|  |  | +    public static void AddMasterDb(this IServiceCollection services, FreeSqlCloud freeSqlCloud, IHostEnvironment env, HostAppOptions hostAppOptions)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        services.AddScoped<DbUnitOfWorkManager>();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        var dbConfig = ConfigHelper.Get<DbConfig>("dbconfig", env.EnvironmentName);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        //创建数据库
 | 
	
		
			
				|  |  | -        if (dbConfig.CreateDb)
 | 
	
		
			
				|  |  | +        freeSqlCloud.Register("master", () =>
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            await DbHelper.CreateDatabaseAsync(dbConfig);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +            var dbConfig = ConfigHelper.Get<DbConfig>("dbconfig", env.EnvironmentName);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        #region FreeSql
 | 
	
		
			
				|  |  | +            //创建数据库
 | 
	
		
			
				|  |  | +            if (dbConfig.CreateDb)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                DbHelper.CreateDatabaseAsync(dbConfig).Wait();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        var freeSqlBuilder = new FreeSqlBuilder()
 | 
	
		
			
				|  |  | -                .UseConnectionString(dbConfig.Type, dbConfig.ConnectionString)
 | 
	
		
			
				|  |  | -                .UseAutoSyncStructure(false)
 | 
	
		
			
				|  |  | -                .UseLazyLoading(false)
 | 
	
		
			
				|  |  | -                .UseNoneCommandParameter(true);
 | 
	
		
			
				|  |  | +            #region FreeSql
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        hostAppOptions?.ConfigureFreeSqlBuilder?.Invoke(freeSqlBuilder);
 | 
	
		
			
				|  |  | +            var freeSqlBuilder = new FreeSqlBuilder()
 | 
	
		
			
				|  |  | +                    .UseConnectionString(dbConfig.Type, dbConfig.ConnectionString)
 | 
	
		
			
				|  |  | +                    .UseAutoSyncStructure(false)
 | 
	
		
			
				|  |  | +                    .UseLazyLoading(false)
 | 
	
		
			
				|  |  | +                    .UseNoneCommandParameter(true);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        #region 监听所有命令
 | 
	
		
			
				|  |  | +            hostAppOptions?.ConfigureFreeSqlBuilder?.Invoke(freeSqlBuilder);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if (dbConfig.MonitorCommand)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
 | 
	
		
			
				|  |  | +            #region 监听所有命令
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (dbConfig.MonitorCommand)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                //Console.WriteLine($"{cmd.CommandText}\n{traceLog}\r\n");
 | 
	
		
			
				|  |  | -                Console.WriteLine($"{cmd.CommandText}\r\n");
 | 
	
		
			
				|  |  | -            });
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +                freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    //Console.WriteLine($"{cmd.CommandText}\n{traceLog}\r\n");
 | 
	
		
			
				|  |  | +                    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);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        //配置实体
 | 
	
		
			
				|  |  | -        var appConfig = ConfigHelper.Get<AppConfig>("appconfig", env.EnvironmentName);
 | 
	
		
			
				|  |  | -        DbHelper.ConfigEntity(fsql, appConfig);
 | 
	
		
			
				|  |  | +            //配置实体
 | 
	
		
			
				|  |  | +            var appConfig = ConfigHelper.Get<AppConfig>("appconfig", env.EnvironmentName);
 | 
	
		
			
				|  |  | +            DbHelper.ConfigEntity(fsql, appConfig);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        hostAppOptions?.ConfigureFreeSql?.Invoke(fsql);
 | 
	
		
			
				|  |  | -        #region 初始化数据库
 | 
	
		
			
				|  |  | +            hostAppOptions?.ConfigureFreeSql?.Invoke(fsql);
 | 
	
		
			
				|  |  | +            #region 初始化数据库
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        //同步结构
 | 
	
		
			
				|  |  | -        if (dbConfig.SyncStructure)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            DbHelper.SyncStructure(fsql, dbConfig: dbConfig, appConfig: appConfig);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +            //同步结构
 | 
	
		
			
				|  |  | +            if (dbConfig.SyncStructure)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                DbHelper.SyncStructure(fsql, dbConfig: dbConfig, appConfig: appConfig);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        var user = services.BuildServiceProvider().GetService<IUser>();
 | 
	
		
			
				|  |  | +            var user = services.BuildServiceProvider().GetService<IUser>();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        #region 审计数据
 | 
	
		
			
				|  |  | +            #region 审计数据
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        //计算服务器时间
 | 
	
		
			
				|  |  | -        var selectProvider = fsql.Select<object>() as Select0Provider;
 | 
	
		
			
				|  |  | -        var serverTime = fsql.Select<object>().WithSql($"select {selectProvider._commonUtils.NowUtc} a").First(a => Convert.ToDateTime("a"));
 | 
	
		
			
				|  |  | -        var timeOffset = DateTime.UtcNow.Subtract(serverTime);
 | 
	
		
			
				|  |  | -        DbHelper.TimeOffset = timeOffset;
 | 
	
		
			
				|  |  | -        fsql.Aop.AuditValue += (s, e) =>
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            DbHelper.AuditValue(e, timeOffset, user);
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | +            //计算服务器时间
 | 
	
		
			
				|  |  | +            var selectProvider = fsql.Select<object>() as Select0Provider;
 | 
	
		
			
				|  |  | +            var serverTime = fsql.Select<object>().WithSql($"select {selectProvider._commonUtils.NowUtc} a").First(a => Convert.ToDateTime("a"));
 | 
	
		
			
				|  |  | +            var timeOffset = DateTime.UtcNow.Subtract(serverTime);
 | 
	
		
			
				|  |  | +            DbHelper.TimeOffset = timeOffset;
 | 
	
		
			
				|  |  | +            fsql.Aop.AuditValue += (s, e) =>
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                DbHelper.AuditValue(e, timeOffset, user);
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        #endregion 审计数据
 | 
	
		
			
				|  |  | +            #endregion 审计数据
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        //同步数据
 | 
	
		
			
				|  |  | -        if (dbConfig.SyncData)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            await DbHelper.SyncDataAsync(fsql, dbConfig, appConfig);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +            //同步数据
 | 
	
		
			
				|  |  | +            if (dbConfig.SyncData)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                DbHelper.SyncDataAsync(fsql, dbConfig, appConfig).Wait();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        #endregion 初始化数据库
 | 
	
		
			
				|  |  | +            #endregion 初始化数据库
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        //生成数据
 | 
	
		
			
				|  |  | -        if (dbConfig.GenerateData && !dbConfig.CreateDb && !dbConfig.SyncData)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            await DbHelper.GenerateDataAsync(fsql, appConfig);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +            //生成数据
 | 
	
		
			
				|  |  | +            if (dbConfig.GenerateData && !dbConfig.CreateDb && !dbConfig.SyncData)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                DbHelper.GenerateDataAsync(fsql, appConfig).Wait();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        #region 监听Curd操作
 | 
	
		
			
				|  |  | +            #region 监听Curd操作
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if (dbConfig.Curd)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            fsql.Aop.CurdBefore += (s, e) =>
 | 
	
		
			
				|  |  | +            if (dbConfig.Curd)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                if (appConfig.MiniProfiler)
 | 
	
		
			
				|  |  | +                fsql.Aop.CurdBefore += (s, e) =>
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    MiniProfiler.Current.CustomTiming("CurdBefore", e.Sql);
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                Console.WriteLine($"{e.Sql}\r\n");
 | 
	
		
			
				|  |  | -            };
 | 
	
		
			
				|  |  | -            fsql.Aop.CurdAfter += (s, e) =>
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                if (appConfig.MiniProfiler)
 | 
	
		
			
				|  |  | +                    if (appConfig.MiniProfiler)
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        MiniProfiler.Current.CustomTiming("CurdBefore", e.Sql);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    Console.WriteLine($"{e.Sql}\r\n");
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +                fsql.Aop.CurdAfter += (s, e) =>
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    MiniProfiler.Current.CustomTiming("CurdAfter", $"{e.ElapsedMilliseconds}");
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            };
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        #endregion 监听Curd操作
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        if (appConfig.Tenant)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            fsql.GlobalFilter.Apply<ITenant>("Tenant", a => a.TenantId == user.TenantId);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        #endregion FreeSql
 | 
	
		
			
				|  |  | +                    if (appConfig.MiniProfiler)
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        MiniProfiler.Current.CustomTiming("CurdAfter", $"{e.ElapsedMilliseconds}");
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        services.AddSingleton(fsql);
 | 
	
		
			
				|  |  | +            #endregion 监听Curd操作
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        //导入多数据库
 | 
	
		
			
				|  |  | -        if (null != dbConfig.Dbs)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            foreach (var multiDb in dbConfig.Dbs)
 | 
	
		
			
				|  |  | +            if (appConfig.Tenant)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                switch (multiDb.Name)
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    case nameof(MySqlDb):
 | 
	
		
			
				|  |  | -                        var mdb = CreateMultiDbBuilder(multiDb).Build<MySqlDb>();
 | 
	
		
			
				|  |  | -                        services.AddSingleton(mdb);
 | 
	
		
			
				|  |  | -                        break;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                    default:
 | 
	
		
			
				|  |  | -                        break;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +                fsql.GlobalFilter.Apply<ITenant>("Tenant", a => a.TenantId == user.TenantId);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    /// <summary>
 | 
	
		
			
				|  |  | -    /// 创建多数据库构建器
 | 
	
		
			
				|  |  | -    /// </summary>
 | 
	
		
			
				|  |  | -    /// <param name="multiDb"></param>
 | 
	
		
			
				|  |  | -    /// <returns></returns>
 | 
	
		
			
				|  |  | -    private static FreeSqlBuilder CreateMultiDbBuilder(MultiDb multiDb)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return new FreeSqlBuilder()
 | 
	
		
			
				|  |  | -        .UseConnectionString(multiDb.Type, multiDb.ConnectionString)
 | 
	
		
			
				|  |  | -        .UseAutoSyncStructure(false)
 | 
	
		
			
				|  |  | -        .UseLazyLoading(false)
 | 
	
		
			
				|  |  | -        .UseNoneCommandParameter(true);
 | 
	
		
			
				|  |  | +            #endregion FreeSql
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            return fsql;
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 |