diff --git a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/Dto/TenantConnectionStringCreateOrUpdate.cs b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/Dto/TenantConnectionStringSetInput.cs similarity index 87% rename from aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/Dto/TenantConnectionStringCreateOrUpdate.cs rename to aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/Dto/TenantConnectionStringSetInput.cs index 39db85f8a..691867cd5 100644 --- a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/Dto/TenantConnectionStringCreateOrUpdate.cs +++ b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/Dto/TenantConnectionStringSetInput.cs @@ -1,15 +1,15 @@ -using System.ComponentModel.DataAnnotations; -using Volo.Abp.Validation; - -namespace LINGYUN.Abp.Saas.Tenants; - -public class TenantConnectionStringCreateOrUpdate -{ - [Required] - [DynamicStringLength(typeof(TenantConnectionStringConsts), nameof(TenantConnectionStringConsts.MaxNameLength))] - public string Name { get; set; } - - [Required] - [DynamicStringLength(typeof(TenantConnectionStringConsts), nameof(TenantConnectionStringConsts.MaxValueLength))] - public string Value { get; set; } -} +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Validation; + +namespace LINGYUN.Abp.Saas.Tenants; + +public class TenantConnectionStringSetInput +{ + [Required] + [DynamicStringLength(typeof(TenantConnectionStringConsts), nameof(TenantConnectionStringConsts.MaxNameLength))] + public string Name { get; set; } + + [Required] + [DynamicStringLength(typeof(TenantConnectionStringConsts), nameof(TenantConnectionStringConsts.MaxValueLength))] + public string Value { get; set; } +} diff --git a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/Dto/TenantCreateDto.cs b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/Dto/TenantCreateDto.cs index 7799a8181..ff7400f47 100644 --- a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/Dto/TenantCreateDto.cs +++ b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/Dto/TenantCreateDto.cs @@ -1,5 +1,11 @@ -using System.Collections.Generic; +using LINGYUN.Abp.Saas.Localization; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Localization; +using System; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.Linq; +using Volo.Abp.Validation; namespace LINGYUN.Abp.Saas.Tenants; @@ -22,10 +28,31 @@ public class TenantCreateDto : TenantCreateOrUpdateBase /// /// 默认数据库连接字符串 /// + [DynamicStringLength(typeof(TenantConnectionStringConsts), nameof(TenantConnectionStringConsts.MaxValueLength))] public string DefaultConnectionString { get; set; } /// /// 其他数据库连接 /// - public Dictionary ConnectionStrings { get; set; } = new Dictionary(); + public List ConnectionStrings { get; set; } = new List(); + + public override IEnumerable Validate(ValidationContext validationContext) + { + var validationResults = base.Validate(validationContext); + + if (!UseSharedDatabase && DefaultConnectionString.IsNullOrWhiteSpace()) + { + var saasResource = validationContext.GetRequiredService>(); + + var errors = new ValidationResult[1] + { + new ValidationResult( + saasResource["IfUseCustomDataBaseDefaultConnectionStringIsRequiredMessage"], + new string[1]{ nameof(DefaultConnectionString) }) + }; + return validationResults.Union(errors); + } + + return validationResults; + } } \ No newline at end of file diff --git a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/ITenantAppService.cs b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/ITenantAppService.cs index de18fb821..db5a30ad1 100644 --- a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/ITenantAppService.cs +++ b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application.Contracts/LINGYUN/Abp/Saas/Tenants/ITenantAppService.cs @@ -26,7 +26,7 @@ public interface ITenantAppService : Task SetConnectionStringAsync( Guid id, - TenantConnectionStringCreateOrUpdate input); + TenantConnectionStringSetInput input); Task DeleteConnectionStringAsync( Guid id, diff --git a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application/LINGYUN/Abp/Saas/Tenants/TenantAppService.cs b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application/LINGYUN/Abp/Saas/Tenants/TenantAppService.cs index b18b9cee6..682914293 100644 --- a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application/LINGYUN/Abp/Saas/Tenants/TenantAppService.cs +++ b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Application/LINGYUN/Abp/Saas/Tenants/TenantAppService.cs @@ -83,18 +83,18 @@ public class TenantAppService : AbpSaasAppServiceBase, ITenantAppService tenant.SetDisableTime(input.DisableTime); input.MapExtraPropertiesTo(tenant); - if (!input.UseSharedDatabase && !input.DefaultConnectionString.IsNullOrWhiteSpace()) + if (!input.UseSharedDatabase) { await CheckConnectionString(input.DefaultConnectionString); tenant.SetDefaultConnectionString(input.DefaultConnectionString); - } - if (input.ConnectionStrings.Any()) - { - foreach (var connectionString in input.ConnectionStrings) + if (input.ConnectionStrings.Any()) { - await CheckConnectionString(connectionString.Value, connectionString.Key); - tenant.SetConnectionString(connectionString.Key, connectionString.Value); + foreach (var connectionString in input.ConnectionStrings) + { + await CheckConnectionString(connectionString.Value, connectionString.Name); + tenant.SetConnectionString(connectionString.Name, connectionString.Value); + } } } @@ -213,7 +213,7 @@ public class TenantAppService : AbpSaasAppServiceBase, ITenantAppService } [Authorize(AbpSaasPermissions.Tenants.ManageConnectionStrings)] - public async virtual Task SetConnectionStringAsync(Guid id, TenantConnectionStringCreateOrUpdate input) + public async virtual Task SetConnectionStringAsync(Guid id, TenantConnectionStringSetInput input) { await CheckConnectionString(input.Value, input.Name); diff --git a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Domain.Shared/LINGYUN/Abp/Saas/Localization/Resources/en.json b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Domain.Shared/LINGYUN/Abp/Saas/Localization/Resources/en.json index e6cc69449..d61e2638c 100644 --- a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Domain.Shared/LINGYUN/Abp/Saas/Localization/Resources/en.json +++ b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Domain.Shared/LINGYUN/Abp/Saas/Localization/Resources/en.json @@ -50,6 +50,7 @@ "Features:ExpiredRecoveryTimeDesc": "If the resource expiration is not handled for a long time, tenant resources will be reclaimed", "UnActived": "UnActived", "RecycleStrategy:Reserve": "Reserve", - "RecycleStrategy:Recycle": "Recycle" + "RecycleStrategy:Recycle": "Recycle", + "IfUseCustomDataBaseDefaultConnectionStringIsRequiredMessage": "If you use a custom database, the default connection string must be required!" } } \ No newline at end of file diff --git a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Domain.Shared/LINGYUN/Abp/Saas/Localization/Resources/zh-Hans.json b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Domain.Shared/LINGYUN/Abp/Saas/Localization/Resources/zh-Hans.json index 684aa2ec5..8bdfc083d 100644 --- a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Domain.Shared/LINGYUN/Abp/Saas/Localization/Resources/zh-Hans.json +++ b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.Domain.Shared/LINGYUN/Abp/Saas/Localization/Resources/zh-Hans.json @@ -50,6 +50,7 @@ "Features:ExpiredRecoveryTimeDesc": "当资源超期多久没有处理, 将回收租户资源", "UnActived": "未启用", "RecycleStrategy:Reserve": "保留", - "RecycleStrategy:Recycle": "回收" + "RecycleStrategy:Recycle": "回收", + "IfUseCustomDataBaseDefaultConnectionStringIsRequiredMessage": "如果使用自定义数据库,默认连接字符串必须输入!" } } \ No newline at end of file diff --git a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.EntityFrameworkCore/LINGYUN/Abp/Saas/EntityFrameworkCore/EfCoreTenantRepository.cs b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.EntityFrameworkCore/LINGYUN/Abp/Saas/EntityFrameworkCore/EfCoreTenantRepository.cs index 5e96affb5..0bbed3fd4 100644 --- a/aspnet-core/modules/saas/LINGYUN.Abp.Saas.EntityFrameworkCore/LINGYUN/Abp/Saas/EntityFrameworkCore/EfCoreTenantRepository.cs +++ b/aspnet-core/modules/saas/LINGYUN.Abp.Saas.EntityFrameworkCore/LINGYUN/Abp/Saas/EntityFrameworkCore/EfCoreTenantRepository.cs @@ -70,7 +70,7 @@ public class EfCoreTenantRepository : EfCoreRepository SetConnectionStringAsync(Guid id, TenantConnectionStringCreateOrUpdate input) + public virtual Task SetConnectionStringAsync(Guid id, TenantConnectionStringSetInput input) { return TenantAppService.SetConnectionStringAsync(id, input); }