SqlSugarRepository.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // 麻省理工学院许可证
  2. //
  3. // 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司 联系电话/微信:18020030720 QQ:515096995
  4. //
  5. // 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
  6. //
  7. // 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
  8. // 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
  9. namespace Admin.NET.Core;
  10. /// <summary>
  11. /// SqlSugar 实体仓储
  12. /// </summary>
  13. /// <typeparam name="T"></typeparam>
  14. public class SqlSugarRepository<T> : SimpleClient<T> where T : class, new()
  15. {
  16. protected ITenant iTenant = null;
  17. public SqlSugarRepository()
  18. {
  19. iTenant = App.GetRequiredService<ISqlSugarClient>().AsTenant();
  20. base.Context = iTenant.GetConnectionScope(SqlSugarConst.MainConfigId);
  21. // 若实体贴有多库特性,则返回指定库连接
  22. if (typeof(T).IsDefined(typeof(TenantAttribute), false))
  23. {
  24. base.Context = iTenant.GetConnectionScopeWithAttr<T>();
  25. return;
  26. }
  27. // 若实体贴有日志表特性,则返回日志库连接
  28. if (typeof(T).IsDefined(typeof(LogTableAttribute), false))
  29. {
  30. base.Context = iTenant.IsAnyConnection(SqlSugarConst.LogConfigId)
  31. ? iTenant.GetConnectionScope(SqlSugarConst.LogConfigId)
  32. : iTenant.GetConnectionScope(SqlSugarConst.MainConfigId);
  33. return;
  34. }
  35. // 若实体贴有系统表特性,则返回默认库连接
  36. if (typeof(T).IsDefined(typeof(SysTableAttribute), false))
  37. {
  38. base.Context = iTenant.GetConnectionScope(SqlSugarConst.MainConfigId);
  39. return;
  40. }
  41. // 若未贴任何表特性或当前未登录或是默认租户Id,则返回默认库连接
  42. var tenantId = App.User?.FindFirst(ClaimConst.TenantId)?.Value;
  43. if (string.IsNullOrWhiteSpace(tenantId) || tenantId == SqlSugarConst.MainConfigId) return;
  44. // 若租户为空或租户以Id隔离模式时,则返回默认库连接
  45. var tenant = App.GetRequiredService<SysCacheService>().Get<List<SysTenant>>(CacheConst.KeyTenant).FirstOrDefault(u => u.Id == long.Parse(tenantId));
  46. if (tenant is null || tenant is { TenantType: TenantTypeEnum.Id }) return;
  47. // 若租户以库隔离模式时,根据租户Id切换库连接
  48. if (!iTenant.IsAnyConnection(tenantId))
  49. {
  50. // 获取默认库连接配置
  51. var dbOptions = App.GetOptions<DbConnectionOptions>();
  52. var mainConnConfig = dbOptions.ConnectionConfigs.First(u => u.ConfigId == SqlSugarConst.MainConfigId);
  53. // 设置租户库连接配置
  54. var tenantConnConfig = new DbConnectionConfig
  55. {
  56. ConfigId = tenant.Id,
  57. DbType = tenant.DbType,
  58. IsAutoCloseConnection = true,
  59. ConnectionString = tenant.Connection,
  60. DbSettings = new DbSettings()
  61. {
  62. EnableUnderLine = mainConnConfig.DbSettings.EnableUnderLine,
  63. }
  64. };
  65. iTenant.AddConnection(tenantConnConfig);
  66. SqlSugarSetup.SetDbConfig(tenantConnConfig);
  67. SqlSugarSetup.SetDbAop(iTenant.GetConnectionScope(tenantId), dbOptions.EnableConsoleSql);
  68. }
  69. base.Context = iTenant.GetConnectionScope(tenantId);
  70. }
  71. }