Просмотр исходного кода

😁增加获取租户库连接方法,优化仓储

zuohuaijun 2 лет назад
Родитель
Сommit
5d3569021e

+ 44 - 1
Admin.NET/Admin.NET.Core/Service/Tenant/SysTenantService.cs

@@ -378,7 +378,7 @@ public class SysTenantService : IDynamicApiController, ITransient
     [DisplayName("创建租户数据库")]
     public async Task CreateDb(TenantInput input)
     {
-        var tenant = await _sysTenantRep.GetFirstAsync(u => u.Id == input.Id);
+        var tenant = await _sysTenantRep.GetSingleAsync(u => u.Id == input.Id);
         if (tenant == null) return;
 
         if (tenant.DbType == SqlSugar.DbType.Oracle)
@@ -412,4 +412,47 @@ public class SysTenantService : IDynamicApiController, ITransient
     {
         return await _sysUserRep.AsQueryable().Filter(null, true).Where(u => u.TenantId == input.TenantId).ToListAsync();
     }
+
+    /// <summary>
+    /// 获取租户数据库连接
+    /// </summary>
+    /// <returns></returns>
+    [NonAction]
+    public SqlSugarScopeProvider GetTenantDbConnectionScope(long tenantId)
+    {
+        var iTenant = _sysTenantRep.AsTenant();
+
+        // 若已存在租户库连接,则直接返回
+        if (iTenant.IsAnyConnection(tenantId))
+            return iTenant.GetConnectionScope(tenantId);
+
+        // 获取租户信息
+        var tenant = _sysTenantRep.GetSingle(u => u.Id == tenantId);
+        if (tenant == null) return null;
+
+        // 获取默认库连接配置
+        var dbOptions = App.GetOptions<DbConnectionOptions>();
+        var mainConnConfig = dbOptions.ConnectionConfigs.First(u => u.ConfigId == SqlSugarConst.MainConfigId);
+
+        // 设置租户库连接配置
+        var tenantConnConfig = new DbConnectionConfig
+        {
+            ConfigId = tenant.Id,
+            DbType = tenant.DbType,
+            IsAutoCloseConnection = true,
+            ConnectionString = tenant.Connection,
+            DbSettings = new DbSettings()
+            {
+                EnableUnderLine = mainConnConfig.DbSettings.EnableUnderLine,
+            }
+        };
+        iTenant.AddConnection(tenantConnConfig);
+
+        var sqlSugarScopeProvider = iTenant.GetConnectionScope(tenantId);
+
+        SqlSugarSetup.SetDbConfig(tenantConnConfig);
+        SqlSugarSetup.SetDbAop(sqlSugarScopeProvider, dbOptions.EnableConsoleSql);
+
+        return sqlSugarScopeProvider;
+    }
 }

+ 4 - 27
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarRepository.cs

@@ -49,33 +49,10 @@ public class SqlSugarRepository<T> : SimpleClient<T> where T : class, new()
         var tenantId = App.User?.FindFirst(ClaimConst.TenantId)?.Value;
         if (string.IsNullOrWhiteSpace(tenantId) || tenantId == SqlSugarConst.MainConfigId) return;
 
-        // 若租户为空或租户以Id隔离模式时,则返回默认库连接
-        var tenant = App.GetRequiredService<SysCacheService>().Get<List<SysTenant>>(CacheConst.KeyTenant).FirstOrDefault(u => u.Id == long.Parse(tenantId));
-        if (tenant is null || tenant is { TenantType: TenantTypeEnum.Id }) return;
+        // 根据租户Id切换库连接, 为空则返回默认库连接
+        var sqlSugarScopeProvider = App.GetRequiredService<SysTenantService>().GetTenantDbConnectionScope(long.Parse(tenantId));
+        if (sqlSugarScopeProvider == null) return;
 
-        // 若租户以库隔离模式时,根据租户Id切换库连接
-        if (!iTenant.IsAnyConnection(tenantId))
-        {
-            // 获取默认库连接配置
-            var dbOptions = App.GetOptions<DbConnectionOptions>();
-            var mainConnConfig = dbOptions.ConnectionConfigs.First(u => u.ConfigId == SqlSugarConst.MainConfigId);
-
-            // 设置租户库连接配置
-            var tenantConnConfig = new DbConnectionConfig
-            {
-                ConfigId = tenant.Id,
-                DbType = tenant.DbType,
-                IsAutoCloseConnection = true,
-                ConnectionString = tenant.Connection,
-                DbSettings = new DbSettings()
-                {
-                    EnableUnderLine = mainConnConfig.DbSettings.EnableUnderLine,
-                }
-            };
-            iTenant.AddConnection(tenantConnConfig);
-            SqlSugarSetup.SetDbConfig(tenantConnConfig);
-            SqlSugarSetup.SetDbAop(iTenant.GetConnectionScope(tenantId), dbOptions.EnableConsoleSql);
-        }
-        base.Context = iTenant.GetConnectionScope(tenantId);
+        base.Context = sqlSugarScopeProvider;
     }
 }