|
@@ -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;
|
|
|
+ });
|
|
|
}
|
|
|
}
|