SqlSugarRepository.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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(ISqlSugarClient context = null) : base(context)
  18. {
  19. iTenant = App.GetRequiredService<ISqlSugarClient>().AsTenant();
  20. // 若实体贴有多库特性,则返回指定的连接
  21. if (typeof(T).IsDefined(typeof(TenantAttribute), false))
  22. {
  23. base.Context = iTenant.GetConnectionScopeWithAttr<T>();
  24. return;
  25. }
  26. // 若实体贴有系统表特性,则返回默认的连接
  27. if (typeof(T).IsDefined(typeof(SystemTableAttribute), false))
  28. {
  29. base.Context = iTenant.GetConnectionScope(SqlSugarConst.ConfigId);
  30. return;
  31. }
  32. // 若当前未登录或是默认租户Id,则返回默认的连接
  33. var tenantId = App.GetRequiredService<UserManager>().TenantId;
  34. if (tenantId < 1 || tenantId.ToString() == SqlSugarConst.ConfigId) return;
  35. var tenant = App.GetRequiredService<SysCacheService>().Get<List<SysTenant>>(CacheConst.KeyTenant)
  36. .FirstOrDefault(u => u.Id == tenantId);
  37. if (tenant is null || tenant is { TenantType: TenantTypeEnum.Id })
  38. {
  39. return;
  40. }
  41. // 根据租户Id切库
  42. if (!iTenant.IsAnyConnection(tenantId.ToString()))
  43. {
  44. // 获取主库连接配置
  45. var dbOptions = App.GetOptions<DbConnectionOptions>();
  46. var mainConnConfig = dbOptions.ConnectionConfigs.First(u => u.ConfigId == SqlSugarConst.ConfigId);
  47. // 连接配置
  48. var connectionConfig = new DbConnectionConfig
  49. {
  50. ConfigId = tenant.Id,
  51. DbType = tenant.DbType,
  52. IsAutoCloseConnection = true,
  53. ConnectionString = tenant.Connection
  54. };
  55. iTenant.AddConnection(connectionConfig);
  56. SqlSugarSetup.SetDbConfig(connectionConfig);
  57. SqlSugarSetup.SetDbAop(iTenant.GetConnectionScope(tenantId.ToString()));
  58. }
  59. base.Context = iTenant.GetConnectionScope(tenantId.ToString());
  60. }
  61. }