From b4b1c9d7817d8547b97ef0e222095267ed62ffc0 Mon Sep 17 00:00:00 2001
From: WangJunZzz <510423039@qq.com>
Date: Sat, 6 Apr 2024 16:47:12 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=A7=9F=E6=88=B7?=
=?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=85=8D=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Dtos/AddOrUpdateConnectionStringInput.cs | 40 +
.../Dtos/DeleteConnectionStringInput.cs | 9 +
.../Dtos/PageTenantConnectionStringInput.cs | 19 +
.../Dtos/PageTenantConnectionStringOutput.cs | 19 +
.../Tenants/IVoloTenantAppService.cs | 17 +-
...cManagementApplicationAutoMapperProfile.cs | 1 +
.../BasicManagementApplicationModule.cs | 2 +-
.../Tenants/VoloTenantAppService.cs | 101 +-
.../Users/AccountAppService.cs | 3 +-
.../BasicManagementErrorCodes.cs | 2 +
.../Localization/BasicManagement/en.json | 4 +-
.../Localization/BasicManagement/zh-Hans.json | 4 +-
.../Tenants/TenantController.cs | 21 +-
.../Aggregates/DataDictionary.cs | 2 +-
.../LanguageManagementDataSeedContributor.cs | 43 +-
.../Languages/Aggregates/Language.cs | 16 +-
.../Languages/LanguageManager.cs | 2 +-
...agementDbContextModelCreatingExtensions.cs | 2 +-
.../Notifications/Etos/NotificationEto.cs | 5 +
.../Notifications/Aggregates/Notification.cs | 18 +-
.../Aggregates/NotificationSubscription.cs | 18 +-
.../Notifications/NotificationManager.cs | 12 +-
.../Lion.AbpPro.HttpApi.Host/appsettings.json | 13 +-
.../appsettings.Production.json | 2 +-
.../Lion.AbpPro.DbMigrator/appsettings.json | 2 +-
.../20240404001711_AddTenantId.Designer.cs | 2003 +++
.../Migrations/20240404001711_AddTenantId.cs | 104 +
...0404004344_RemoveLanguageIndex.Designer.cs | 2002 +++
.../20240404004344_RemoveLanguageIndex.cs | 37 +
.../AbpProDbContextModelSnapshot.cs | 23 +-
vben28/src/locales/lang/en/common.ts | 1 +
vben28/src/locales/lang/zh-CN/common.ts | 1 +
vben28/src/services/ServiceProxies.ts | 345 +-
.../views/tenants/CreateConnectionString.vue | 70 +
.../views/tenants/EditConnectionString.vue | 136 +-
vben28/src/views/tenants/Tenant.ts | 69 +-
vben28/src/views/tenants/Tenant.vue | 16 +-
vben28/yarn.lock | 11739 ++++++++++++++++
38 files changed, 16690 insertions(+), 233 deletions(-)
create mode 100644 aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/Dtos/AddOrUpdateConnectionStringInput.cs
create mode 100644 aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/Dtos/DeleteConnectionStringInput.cs
create mode 100644 aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/Dtos/PageTenantConnectionStringInput.cs
create mode 100644 aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/Dtos/PageTenantConnectionStringOutput.cs
create mode 100644 aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/Migrations/20240404001711_AddTenantId.Designer.cs
create mode 100644 aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/Migrations/20240404001711_AddTenantId.cs
create mode 100644 aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/Migrations/20240404004344_RemoveLanguageIndex.Designer.cs
create mode 100644 aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/Migrations/20240404004344_RemoveLanguageIndex.cs
create mode 100644 vben28/src/views/tenants/CreateConnectionString.vue
create mode 100644 vben28/yarn.lock
diff --git a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/Dtos/AddOrUpdateConnectionStringInput.cs b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/Dtos/AddOrUpdateConnectionStringInput.cs
new file mode 100644
index 00000000..023706aa
--- /dev/null
+++ b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/Dtos/AddOrUpdateConnectionStringInput.cs
@@ -0,0 +1,40 @@
+namespace Lion.AbpPro.BasicManagement.Tenants.Dtos;
+
+public class AddOrUpdateConnectionStringInput : IValidatableObject
+{
+
+ ///
+ /// id
+ ///
+ public Guid Id { get; set; }
+
+ ///
+ /// 连接字符串名称
+ ///
+ public string Name { get; set; }
+
+ ///
+ /// 连接字符串地址
+ ///
+ public string Value { get; set; }
+
+ public IEnumerable Validate(ValidationContext validationContext)
+ {
+ var localization = validationContext.GetRequiredService>();
+ if (Name.IsNullOrWhiteSpace())
+ {
+ yield return new ValidationResult(
+ localization[AbpProLocalizationErrorCodes.ErrorCode100003, nameof(Name)],
+ new[] { nameof(Name) }
+ );
+ }
+
+ if (Value.IsNullOrWhiteSpace())
+ {
+ yield return new ValidationResult(
+ localization[AbpProLocalizationErrorCodes.ErrorCode100003, nameof(Value)],
+ new[] { nameof(Value) }
+ );
+ }
+ }
+}
\ No newline at end of file
diff --git a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/Dtos/DeleteConnectionStringInput.cs b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/Dtos/DeleteConnectionStringInput.cs
new file mode 100644
index 00000000..b6aad3dc
--- /dev/null
+++ b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/Dtos/DeleteConnectionStringInput.cs
@@ -0,0 +1,9 @@
+namespace Lion.AbpPro.BasicManagement.Tenants.Dtos;
+
+public class DeleteConnectionStringInput
+{
+ ///
+ /// 连接字符串名称
+ ///
+ public string Name { get; set; }
+}
\ No newline at end of file
diff --git a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/Dtos/PageTenantConnectionStringInput.cs b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/Dtos/PageTenantConnectionStringInput.cs
new file mode 100644
index 00000000..35959ff7
--- /dev/null
+++ b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/Dtos/PageTenantConnectionStringInput.cs
@@ -0,0 +1,19 @@
+namespace Lion.AbpPro.BasicManagement.Tenants.Dtos;
+
+public class PageTenantConnectionStringInput
+{
+ ///
+ /// 租户id
+ ///
+ public Guid Id { get; set; }
+
+ ///
+ /// 连接字符串名称
+ ///
+ public string Name { get; set; }
+
+ ///
+ /// 连接字符串地址
+ ///
+ public string Value { get; set; }
+}
\ No newline at end of file
diff --git a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/Dtos/PageTenantConnectionStringOutput.cs b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/Dtos/PageTenantConnectionStringOutput.cs
new file mode 100644
index 00000000..9b067ca6
--- /dev/null
+++ b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/Dtos/PageTenantConnectionStringOutput.cs
@@ -0,0 +1,19 @@
+namespace Lion.AbpPro.BasicManagement.Tenants.Dtos;
+
+public class PageTenantConnectionStringOutput
+{
+ ///
+ /// 租户id
+ ///
+ public Guid TenantId { get; set; }
+
+ ///
+ /// 连接字符串名称
+ ///
+ public string Name { get; set; }
+
+ ///
+ /// 连接字符串地址
+ ///
+ public string Value { get; set; }
+}
\ No newline at end of file
diff --git a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/IVoloTenantAppService.cs b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/IVoloTenantAppService.cs
index ef71680e..fd3158e1 100644
--- a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/IVoloTenantAppService.cs
+++ b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application.Contracts/Tenants/IVoloTenantAppService.cs
@@ -12,10 +12,19 @@ namespace Lion.AbpPro.BasicManagement.Tenants
Task DeleteAsync(IdInput input);
- Task GetDefaultConnectionStringAsync(IdInput input);
+ ///
+ /// 分页获取租户连接字符串
+ ///
+ Task> PageConnectionStringsAsync(PageTenantConnectionStringInput input);
- Task UpdateDefaultConnectionStringAsync(UpdateConnectionStringInput input);
-
- Task DeleteDefaultConnectionStringAsync(IdInput input);
+ ///
+ /// 新增或者更新连接字符串
+ ///
+ Task AddOrUpdateConnectionStringAsync(AddOrUpdateConnectionStringInput input);
+
+ ///
+ /// 删除连接字符串
+ ///
+ Task DeleteConnectionStringAsync(DeleteConnectionStringInput input);
}
}
\ No newline at end of file
diff --git a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application/BasicManagementApplicationAutoMapperProfile.cs b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application/BasicManagementApplicationAutoMapperProfile.cs
index eb39f113..2b24bda8 100644
--- a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application/BasicManagementApplicationAutoMapperProfile.cs
+++ b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application/BasicManagementApplicationAutoMapperProfile.cs
@@ -34,5 +34,6 @@ public class BasicManagementApplicationAutoMapperProfile : Profile
CreateMap();
CreateMap();
CreateMap();
+ CreateMap();
}
}
\ No newline at end of file
diff --git a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application/BasicManagementApplicationModule.cs b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application/BasicManagementApplicationModule.cs
index a8e6b1b7..c7de97dc 100644
--- a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application/BasicManagementApplicationModule.cs
+++ b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application/BasicManagementApplicationModule.cs
@@ -47,7 +47,7 @@ public class BasicManagementApplicationModule : AbpModule
options.Excludes.Add(SettingManagementPermissions.GroupName);
options.Excludes.Add(SettingManagementPermissions.Emailing);
options.Excludes.Add(TenantManagementPermissions.Tenants.ManageFeatures);
- options.Excludes.Add(TenantManagementPermissions.Tenants.ManageConnectionStrings);
+ //options.Excludes.Add(TenantManagementPermissions.Tenants.ManageConnectionStrings);
});
context.Services.Configure(context.Services.GetConfiguration().GetSection("Jwt"));
diff --git a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application/Tenants/VoloTenantAppService.cs b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application/Tenants/VoloTenantAppService.cs
index 362967cc..d8e3c226 100644
--- a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application/Tenants/VoloTenantAppService.cs
+++ b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application/Tenants/VoloTenantAppService.cs
@@ -1,3 +1,7 @@
+using Volo.Abp.BackgroundJobs;
+using Volo.Abp.FeatureManagement;
+using Volo.Abp.SettingManagement;
+
namespace Lion.AbpPro.BasicManagement.Tenants
{
[Authorize(TenantManagementPermissions.Tenants.Default)]
@@ -5,22 +9,25 @@ namespace Lion.AbpPro.BasicManagement.Tenants
{
private readonly IAbpTenantAppService _abpTenantAppService;
private readonly ITenantAppService _tenantAppService;
+ private readonly ITenantRepository _tenantRepository;
public VoloTenantAppService(
- IAbpTenantAppService abpTenantAppService,
- ITenantAppService tenantAppService)
+ IAbpTenantAppService abpTenantAppService,
+ ITenantAppService tenantAppService,
+ ITenantRepository tenantRepository)
{
_abpTenantAppService = abpTenantAppService;
_tenantAppService = tenantAppService;
+ _tenantRepository = tenantRepository;
}
-
+
[AllowAnonymous]
public virtual async Task FindTenantByNameAsync(FindTenantByNameInput input)
{
return await _abpTenantAppService.FindTenantByNameAsync(input.Name);
}
-
+
public virtual Task> ListAsync(PagingTenantInput input)
{
var request = new GetTenantsInput
@@ -30,13 +37,13 @@ namespace Lion.AbpPro.BasicManagement.Tenants
return _tenantAppService.GetListAsync(request);
}
- [Authorize(policy:TenantManagementPermissions.Tenants.Create)]
+ [Authorize(policy: TenantManagementPermissions.Tenants.Create)]
public virtual Task CreateAsync(TenantCreateDto input)
{
return _tenantAppService.CreateAsync(input);
}
- [Authorize(policy:TenantManagementPermissions.Tenants.Update)]
+ [Authorize(policy: TenantManagementPermissions.Tenants.Update)]
public virtual Task UpdateAsync(UpdateTenantInput input)
{
var request = new TenantUpdateDto()
@@ -46,29 +53,91 @@ namespace Lion.AbpPro.BasicManagement.Tenants
return _tenantAppService.UpdateAsync(input.Id, request);
}
- [Authorize(policy:TenantManagementPermissions.Tenants.Delete)]
+ [Authorize(policy: TenantManagementPermissions.Tenants.Delete)]
public virtual Task DeleteAsync(IdInput input)
{
return _tenantAppService.DeleteAsync(input.Id);
}
+
[Authorize(TenantManagementPermissions.Tenants.ManageConnectionStrings)]
- public virtual Task GetDefaultConnectionStringAsync(IdInput input)
- {
- return _tenantAppService.GetDefaultConnectionStringAsync(input.Id);
+ public async Task> PageConnectionStringsAsync(PageTenantConnectionStringInput input)
+ {
+ var result = new PagedResultDto();
+ var tenant = await _tenantRepository.FindAsync(input.Id, true);
+
+ if (tenant == null)
+ {
+ throw new BusinessException(BasicManagementErrorCodes.TenantNotExist);
+ }
+
+ result.TotalCount = tenant.ConnectionStrings.Count;
+
+ var items = ObjectMapper.Map, List>(tenant.ConnectionStrings);
+ if (input.Name.IsNotNullOrWhiteSpace())
+ {
+ items = items.Where(e => e.Name.ToLower().Contains(input.Name.ToLower())).ToList();
+ }
+ if (input.Value.IsNotNullOrWhiteSpace())
+ {
+ items = items.Where(e => e.Value.ToLower().Contains(input.Value.ToLower())).ToList();
+ }
+ result.Items = items;
+
+ return result;
}
[Authorize(TenantManagementPermissions.Tenants.ManageConnectionStrings)]
- public virtual Task UpdateDefaultConnectionStringAsync(UpdateConnectionStringInput input)
+ public async Task AddOrUpdateConnectionStringAsync(AddOrUpdateConnectionStringInput input)
{
- return _tenantAppService.UpdateDefaultConnectionStringAsync(input.Id,
- input.ConnectionString);
+
+ // abp 租户,feature,background,setting 模块不支持单独配置数据库
+ if (AbpTenantManagementDbProperties.ConnectionStringName.ToLower() == input.Name.ToLower() ||
+ AbpBackgroundJobsDbProperties.ConnectionStringName.ToLower()== input.Name.ToLower() ||
+ AbpFeatureManagementDbProperties.ConnectionStringName.ToLower() == input.Name.ToLower() ||
+ AbpSettingManagementDbProperties.ConnectionStringName.ToLower() == input.Name.ToLower())
+ {
+ throw new BusinessException(BasicManagementErrorCodes.NotSupportSetConnectionString);
+ }
+ var tenant = await _tenantRepository.FindAsync(input.Id, true);
+
+ if (tenant == null)
+ {
+ throw new BusinessException(BasicManagementErrorCodes.TenantNotExist);
+ }
+
+ var connectionString = tenant.ConnectionStrings.FirstOrDefault(e => e.Value == input.Name);
+ if (connectionString == null)
+ {
+ tenant.SetConnectionString(input.Name, input.Value);
+ }
+ else
+ {
+ if (connectionString.Value != input.Value)
+ {
+ tenant.SetConnectionString(input.Name, input.Value);
+ }
+ }
}
- [Authorize(TenantManagementPermissions.Tenants.ManageConnectionStrings)]
- public virtual Task DeleteDefaultConnectionStringAsync(IdInput input)
+ public async Task DeleteConnectionStringAsync(DeleteConnectionStringInput input)
{
- return _tenantAppService.DeleteDefaultConnectionStringAsync(input.Id);
+ if (!CurrentTenant.Id.HasValue)
+ {
+ throw new BusinessException(BasicManagementErrorCodes.TenantNotExist);
+ }
+
+ var tenant = await _tenantRepository.FindAsync(CurrentTenant.Id.Value, true);
+
+ if (tenant == null)
+ {
+ throw new BusinessException(BasicManagementErrorCodes.TenantNotExist);
+ }
+ var connectionString = tenant.ConnectionStrings.FirstOrDefault(e => e.Value == input.Name);
+ if (connectionString != null)
+ {
+ tenant.RemoveConnectionString(input.Name);
+ }
}
}
}
\ No newline at end of file
diff --git a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application/Users/AccountAppService.cs b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application/Users/AccountAppService.cs
index 79a71eea..4f12174d 100644
--- a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application/Users/AccountAppService.cs
+++ b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Application/Users/AccountAppService.cs
@@ -92,8 +92,7 @@ namespace Lion.AbpPro.BasicManagement.Users
/// 生成jwt token
///
///
- private string GenerateJwt(Guid userId, string userName, string name, string email,
- string tenantId, List roles)
+ private string GenerateJwt(Guid userId, string userName, string name, string email, string tenantId, List roles)
{
var dateNow = Clock.Now;
var expirationTime = dateNow.AddHours(_jwtOptions.ExpirationTime);
diff --git a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Domain.Shared/BasicManagementErrorCodes.cs b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Domain.Shared/BasicManagementErrorCodes.cs
index cf050422..71ab948a 100644
--- a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Domain.Shared/BasicManagementErrorCodes.cs
+++ b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Domain.Shared/BasicManagementErrorCodes.cs
@@ -6,4 +6,6 @@ public static class BasicManagementErrorCodes
public const string UserLockedOut = BasicManagementConsts.NameSpace + ":100002";
public const string UserOrPasswordMismatch = BasicManagementConsts.NameSpace + ":100003";
public const string UserDisabled = BasicManagementConsts.NameSpace + ":100004";
+ public const string TenantNotExist = BasicManagementConsts.NameSpace + ":100005";
+ public const string NotSupportSetConnectionString = BasicManagementConsts.NameSpace + ":100006";
}
\ No newline at end of file
diff --git a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Domain.Shared/Localization/BasicManagement/en.json b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Domain.Shared/Localization/BasicManagement/en.json
index f4df7485..f2840490 100644
--- a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Domain.Shared/Localization/BasicManagement/en.json
+++ b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Domain.Shared/Localization/BasicManagement/en.json
@@ -19,6 +19,8 @@
"Lion.AbpPro.BasicManagement:100001": "OrganizationUnit Not Exist",
"Lion.AbpPro.BasicManagement:100002": "UserLockedOut",
"Lion.AbpPro.BasicManagement:100003": "UserOrPasswordMismatch",
- "Lion.AbpPro.BasicManagement:100004": "UserDisabled"
+ "Lion.AbpPro.BasicManagement:100004": "UserDisabled",
+ "Lion.AbpPro.BasicManagement:100005": "Tenant Not Exist",
+ "Lion.AbpPro.BasicManagement:100006": "Not Support Set ConnectionString"
}
}
\ No newline at end of file
diff --git a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Domain.Shared/Localization/BasicManagement/zh-Hans.json b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Domain.Shared/Localization/BasicManagement/zh-Hans.json
index a1c960f4..6595b0fe 100644
--- a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Domain.Shared/Localization/BasicManagement/zh-Hans.json
+++ b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.Domain.Shared/Localization/BasicManagement/zh-Hans.json
@@ -20,6 +20,8 @@
"Lion.AbpPro.BasicManagement:100001": "组织机构不存在",
"Lion.AbpPro.BasicManagement:100002": "用户被锁定",
"Lion.AbpPro.BasicManagement:100003": "用户名或者密码错误",
- "Lion.AbpPro.BasicManagement:100004": "用户已禁用"
+ "Lion.AbpPro.BasicManagement:100004": "用户已禁用",
+ "Lion.AbpPro.BasicManagement:100005": "租户不存在",
+ "Lion.AbpPro.BasicManagement:100006": "当前模块不支持设置数据库连接字符串"
}
}
\ No newline at end of file
diff --git a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.HttpApi/Tenants/TenantController.cs b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.HttpApi/Tenants/TenantController.cs
index 0dd84612..dba9ba50 100644
--- a/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.HttpApi/Tenants/TenantController.cs
+++ b/aspnet-core/modules/BasicManagement/src/Lion.AbpPro.BasicManagement.HttpApi/Tenants/TenantController.cs
@@ -48,26 +48,27 @@ namespace Lion.AbpPro.BasicManagement.Tenants
{
return _voloTenantAppService.DeleteAsync(input);
}
+
- [HttpPost("getConnectionString")]
- [SwaggerOperation(summary: "获取租户连接字符串", Tags = new[] { "Tenants" })]
- public Task GetDefaultConnectionStringAsync(IdInput input)
+ [HttpPost("pageConnectionString")]
+ [SwaggerOperation(summary: "分页租户连接字符串", Tags = new[] { "Tenants" })]
+ public Task> PageConnectionStringsAsync(PageTenantConnectionStringInput input)
{
- return _voloTenantAppService.GetDefaultConnectionStringAsync(input);
+ return _voloTenantAppService.PageConnectionStringsAsync(input);
}
- [HttpPost("updateConnectionString")]
- [SwaggerOperation(summary: "更新租户连接字符串", Tags = new[] { "Tenants" })]
- public Task UpdateDefaultConnectionStringAsync(UpdateConnectionStringInput input)
+ [HttpPost("addOrUpdateConnectionString")]
+ [SwaggerOperation(summary: "新增或者更新租户所有连接字符串", Tags = new[] { "Tenants" })]
+ public Task AddOrUpdateConnectionStringAsync(AddOrUpdateConnectionStringInput input)
{
- return _voloTenantAppService.UpdateDefaultConnectionStringAsync(input);
+ return _voloTenantAppService.AddOrUpdateConnectionStringAsync(input);
}
[HttpPost("deleteConnectionString")]
[SwaggerOperation(summary: "删除租户连接字符串", Tags = new[] { "Tenants" })]
- public Task DeleteDefaultConnectionStringAsync(IdInput input)
+ public Task DeleteConnectionStringAsync(DeleteConnectionStringInput input)
{
- return _voloTenantAppService.DeleteDefaultConnectionStringAsync(input);
+ return _voloTenantAppService.DeleteConnectionStringAsync(input);
}
}
}
\ No newline at end of file
diff --git a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/Aggregates/DataDictionary.cs b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/Aggregates/DataDictionary.cs
index cca7d6b6..c5de27a1 100644
--- a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/Aggregates/DataDictionary.cs
+++ b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/Aggregates/DataDictionary.cs
@@ -61,7 +61,7 @@ public class DataDictionary : FullAuditedAggregateRoot, IMultiTenant
SetTenantId(tenantId);
}
- public void SetTenantId(Guid? tenantId)
+ private void SetTenantId(Guid? tenantId)
{
TenantId = tenantId;
}
diff --git a/aspnet-core/modules/LanguageManagement/src/Lion.AbpPro.LanguageManagement.Domain/Data/LanguageManagementDataSeedContributor.cs b/aspnet-core/modules/LanguageManagement/src/Lion.AbpPro.LanguageManagement.Domain/Data/LanguageManagementDataSeedContributor.cs
index 38eaf76a..90fe45eb 100644
--- a/aspnet-core/modules/LanguageManagement/src/Lion.AbpPro.LanguageManagement.Domain/Data/LanguageManagementDataSeedContributor.cs
+++ b/aspnet-core/modules/LanguageManagement/src/Lion.AbpPro.LanguageManagement.Domain/Data/LanguageManagementDataSeedContributor.cs
@@ -10,42 +10,51 @@ public class LanguageManagementDataSeedContributor : ITransientDependency, IData
private readonly IDataFilter _softDeleteFilter;
private readonly IGuidGenerator _guidGenerator;
private readonly ISettingManager _settingManager;
+ private readonly ICurrentTenant _currentTenant;
+
public LanguageManagementDataSeedContributor(
ILanguageRepository languageRepository,
IOptions localizationOptions,
IDataFilter softDeleteFilter,
IGuidGenerator guidGenerator,
- ISettingManager settingManager)
+ ISettingManager settingManager,
+ ICurrentTenant currentTenant)
{
_languageRepository = languageRepository;
_softDeleteFilter = softDeleteFilter;
_guidGenerator = guidGenerator;
_settingManager = settingManager;
+ _currentTenant = currentTenant;
_localizationOptions = localizationOptions.Value;
}
public async Task SeedAsync(DataSeedContext context)
{
- var defaultLanguage = await _settingManager.GetOrNullDefaultAsync(LanguageManagementConsts.SettingDefaultLanguage);
- using (_softDeleteFilter.Disable())
+ using (_currentTenant.Change(context?.TenantId))
{
- var languages = await _languageRepository.GetListAsync();
- foreach (var language in _localizationOptions.Languages)
+ var defaultLanguage = await _settingManager.GetOrNullDefaultAsync(LanguageManagementConsts.SettingDefaultLanguage);
+ using (_softDeleteFilter.Disable())
{
- if (!languages.Any(e => e.CultureName == language.CultureName && e.UiCultureName == language.UiCultureName))
+ var languages = await _languageRepository.GetListAsync();
+ foreach (var language in _localizationOptions.Languages)
{
- var isDefault = language.CultureName == defaultLanguage;
- await _languageRepository.InsertAsync(
- new Language(
- _guidGenerator.Create(),
- language.CultureName,
- language.UiCultureName,
- language.DisplayName,
- language.FlagIcon,
- true,
- isDefault));
+ if (!languages.Any(e => e.CultureName == language.CultureName && e.UiCultureName == language.UiCultureName))
+ {
+ var isDefault = language.CultureName == defaultLanguage;
+ await _languageRepository.InsertAsync(
+ new Language(
+ _guidGenerator.Create(),
+ language.CultureName,
+ language.UiCultureName,
+ language.DisplayName,
+ language.FlagIcon,
+ true,
+ isDefault,
+ _currentTenant.Id));
+ }
}
- }
+ }
}
+
}
}
\ No newline at end of file
diff --git a/aspnet-core/modules/LanguageManagement/src/Lion.AbpPro.LanguageManagement.Domain/Languages/Aggregates/Language.cs b/aspnet-core/modules/LanguageManagement/src/Lion.AbpPro.LanguageManagement.Domain/Languages/Aggregates/Language.cs
index 6732741b..0cd874e7 100644
--- a/aspnet-core/modules/LanguageManagement/src/Lion.AbpPro.LanguageManagement.Domain/Languages/Aggregates/Language.cs
+++ b/aspnet-core/modules/LanguageManagement/src/Lion.AbpPro.LanguageManagement.Domain/Languages/Aggregates/Language.cs
@@ -1,6 +1,6 @@
namespace Lion.AbpPro.LanguageManagement.Languages.Aggregates;
-public class Language : FullAuditedAggregateRoot, ILanguageInfo
+public class Language : FullAuditedAggregateRoot, ILanguageInfo, IMultiTenant
{
private Language()
{
@@ -14,7 +14,8 @@ public class Language : FullAuditedAggregateRoot, ILanguageInfo
string displayName,
string flagIcon,
bool isEnabled,
- bool isDefault
+ bool isDefault,
+ Guid? tenantId = null
) : base(id)
{
SetCultureName(cultureName);
@@ -23,8 +24,14 @@ public class Language : FullAuditedAggregateRoot, ILanguageInfo
SetFlagIcon(flagIcon);
SetEnabled(isEnabled);
SetDefault(isDefault);
+ SetTenantId(tenantId);
}
+ ///
+ /// 租户id
+ ///
+ public Guid? TenantId { get; private set; }
+
///
/// 语言名称
///
@@ -95,6 +102,11 @@ public class Language : FullAuditedAggregateRoot, ILanguageInfo
IsEnabled = isEnabled;
}
+ public void SetTenantId(Guid? tenantId)
+ {
+ TenantId = tenantId;
+ }
+
///
/// 更新语言
///
diff --git a/aspnet-core/modules/LanguageManagement/src/Lion.AbpPro.LanguageManagement.Domain/Languages/LanguageManager.cs b/aspnet-core/modules/LanguageManagement/src/Lion.AbpPro.LanguageManagement.Domain/Languages/LanguageManager.cs
index b288a867..80bb5c2e 100644
--- a/aspnet-core/modules/LanguageManagement/src/Lion.AbpPro.LanguageManagement.Domain/Languages/LanguageManager.cs
+++ b/aspnet-core/modules/LanguageManagement/src/Lion.AbpPro.LanguageManagement.Domain/Languages/LanguageManager.cs
@@ -54,7 +54,7 @@ public class LanguageManager : LanguageManagementDomainService, ILanguageManager
throw new LanguageManagementDomainException(LanguageManagementErrorCodes.LanguageExist);
}
- entity = new Language(id, cultureName, uiCultureName, displayName, flagIcon, isEnabled, false);
+ entity = new Language(id, cultureName, uiCultureName, displayName, flagIcon, isEnabled, false, CurrentTenant.Id);
entity = await _languageRepository.InsertAsync(entity);
return ObjectMapper.Map(entity);
}
diff --git a/aspnet-core/modules/LanguageManagement/src/Lion.AbpPro.LanguageManagement.EntityFrameworkCore/EntityFrameworkCore/LanguageManagementDbContextModelCreatingExtensions.cs b/aspnet-core/modules/LanguageManagement/src/Lion.AbpPro.LanguageManagement.EntityFrameworkCore/EntityFrameworkCore/LanguageManagementDbContextModelCreatingExtensions.cs
index abf6fa8b..3e72b474 100644
--- a/aspnet-core/modules/LanguageManagement/src/Lion.AbpPro.LanguageManagement.EntityFrameworkCore/EntityFrameworkCore/LanguageManagementDbContextModelCreatingExtensions.cs
+++ b/aspnet-core/modules/LanguageManagement/src/Lion.AbpPro.LanguageManagement.EntityFrameworkCore/EntityFrameworkCore/LanguageManagementDbContextModelCreatingExtensions.cs
@@ -15,7 +15,7 @@ namespace Lion.AbpPro.LanguageManagement.EntityFrameworkCore
b.Property(e => e.DisplayName).IsRequired().HasMaxLength(128).HasComment("显示名称");
b.Property(e => e.FlagIcon).HasMaxLength(128).HasComment("图标");
b.Property(x => x.IsEnabled).IsRequired();
- b.HasIndex(e => e.CultureName).IsUnique();
+ b.HasIndex(e => e.CultureName);
b.ConfigureByConvention();
});
diff --git a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Notifications/Etos/NotificationEto.cs b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Notifications/Etos/NotificationEto.cs
index f9d154d8..11f7b4ce 100644
--- a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Notifications/Etos/NotificationEto.cs
+++ b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain.Shared/Notifications/Etos/NotificationEto.cs
@@ -7,6 +7,11 @@ namespace Lion.AbpPro.NotificationManagement.Notifications.Etos
{
public class NotificationEto
{
+ ///
+ /// 租户id
+ ///
+ public Guid? TenantId { get; set; }
+
public Guid Id { get; set; }
///
diff --git a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/Aggregates/Notification.cs b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/Aggregates/Notification.cs
index a32a1c79..269550f9 100644
--- a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/Aggregates/Notification.cs
+++ b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/Aggregates/Notification.cs
@@ -1,10 +1,17 @@
+using Volo.Abp.MultiTenancy;
+
namespace Lion.AbpPro.NotificationManagement.Notifications.Aggregates
{
///
/// 消息通知
///
- public class Notification : FullAuditedAggregateRoot
+ public class Notification : FullAuditedAggregateRoot, IMultiTenant
{
+ ///
+ /// 租户id
+ ///
+ public Guid? TenantId { get; private set; }
+
///
/// 消息标题
///
@@ -50,7 +57,8 @@ namespace Lion.AbpPro.NotificationManagement.Notifications.Aggregates
string content,
MessageType messageType,
MessageLevel messageLevel,
- Guid senderId
+ Guid senderId,
+ Guid? tenantId = null
) : base(id)
{
NotificationSubscriptions = new List();
@@ -62,6 +70,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications.Aggregates
messageLevel,
senderId
);
+ SetTenantId(tenantId);
}
private void SetProperties(
@@ -79,6 +88,11 @@ namespace Lion.AbpPro.NotificationManagement.Notifications.Aggregates
SetSenderId(senderId);
}
+ private void SetTenantId(Guid? tenantId)
+ {
+ TenantId = tenantId;
+ }
+
private void SetSenderId(Guid senderId)
{
Guard.NotEmpty(senderId, nameof(senderId));
diff --git a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/Aggregates/NotificationSubscription.cs b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/Aggregates/NotificationSubscription.cs
index a5fe7271..1dec78b0 100644
--- a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/Aggregates/NotificationSubscription.cs
+++ b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/Aggregates/NotificationSubscription.cs
@@ -1,10 +1,17 @@
+using Volo.Abp.MultiTenancy;
+
namespace Lion.AbpPro.NotificationManagement.Notifications.Aggregates
{
///
/// 消息订阅者
///
- public class NotificationSubscription : FullAuditedEntity
+ public class NotificationSubscription : FullAuditedEntity, IMultiTenant
{
+ ///
+ /// 租户id
+ ///
+ public Guid? TenantId { get; private set; }
+
///
/// 消息Id
///
@@ -33,15 +40,22 @@ namespace Lion.AbpPro.NotificationManagement.Notifications.Aggregates
public NotificationSubscription(
Guid id,
Guid notificationId,
- Guid receiveId
+ Guid receiveId,
+ Guid? tenantId = null
) : base(id)
{
SetNotificationId(notificationId);
SetReceiveId(receiveId);
Read = false;
ReadTime = null;
+ SetTenantId(tenantId);
}
+ private void SetTenantId(Guid? tenantId)
+ {
+ TenantId = tenantId;
+ }
+
private void SetNotificationId(Guid notificationId)
{
NotificationId = notificationId;
diff --git a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/NotificationManager.cs b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/NotificationManager.cs
index 3e6208ba..e45f6c4a 100644
--- a/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/NotificationManager.cs
+++ b/aspnet-core/modules/NotificationManagement/src/Lion.AbpPro.NotificationManagement.Domain/Notifications/NotificationManager.cs
@@ -53,7 +53,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
senderId = _currentUser.Id.Value;
}
- var entity = new Notification(GuidGenerator.Create(), title, content, MessageType.Common, MessageLevel.Warning, senderId);
+ var entity = new Notification(GuidGenerator.Create(), title, content, MessageType.Common, MessageLevel.Warning, senderId, CurrentTenant.Id);
foreach (var item in receiveIds)
{
entity.AddNotificationSubscription(GuidGenerator.Create(), item);
@@ -84,7 +84,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
senderId = _currentUser.Id.Value;
}
- var entity = new Notification(GuidGenerator.Create(), title, content, MessageType.Common, MessageLevel.Information, senderId);
+ var entity = new Notification(GuidGenerator.Create(), title, content, MessageType.Common, MessageLevel.Information, senderId, CurrentTenant.Id);
foreach (var item in receiveIds)
{
entity.AddNotificationSubscription(GuidGenerator.Create(), item);
@@ -112,7 +112,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
senderId = _currentUser.Id.Value;
}
- var entity = new Notification(GuidGenerator.Create(), title, content, MessageType.Common, MessageLevel.Error, senderId);
+ var entity = new Notification(GuidGenerator.Create(), title, content, MessageType.Common, MessageLevel.Error, senderId, CurrentTenant.Id);
foreach (var item in receiveIds)
{
entity.AddNotificationSubscription(GuidGenerator.Create(), item);
@@ -137,7 +137,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
senderId = _currentUser.Id.Value;
}
- var entity = new Notification(GuidGenerator.Create(), title, content, MessageType.BroadCast, MessageLevel.Warning, senderId);
+ var entity = new Notification(GuidGenerator.Create(), title, content, MessageType.BroadCast, MessageLevel.Warning, senderId, CurrentTenant.Id);
var notificationEto = ObjectMapper.Map(entity);
// 发送集成事件
entity.AddCreatedNotificationLocalEvent(new CreatedNotificationLocalEvent(notificationEto));
@@ -157,7 +157,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
senderId = _currentUser.Id.Value;
}
- var entity = new Notification(GuidGenerator.Create(), title, content, MessageType.BroadCast, MessageLevel.Information, senderId);
+ var entity = new Notification(GuidGenerator.Create(), title, content, MessageType.BroadCast, MessageLevel.Information, senderId, CurrentTenant.Id);
var notificationEto = ObjectMapper.Map(entity);
// 发送集成事件
entity.AddCreatedNotificationLocalEvent(new CreatedNotificationLocalEvent(notificationEto));
@@ -177,7 +177,7 @@ namespace Lion.AbpPro.NotificationManagement.Notifications
senderId = _currentUser.Id.Value;
}
- var entity = new Notification(GuidGenerator.Create(), title, content, MessageType.BroadCast, MessageLevel.Error, senderId);
+ var entity = new Notification(GuidGenerator.Create(), title, content, MessageType.BroadCast, MessageLevel.Error, senderId, CurrentTenant.Id);
var notificationEto = ObjectMapper.Map(entity);
entity.AddCreatedNotificationLocalEvent(new CreatedNotificationLocalEvent(notificationEto));
await _notificationRepository.InsertAsync(entity);
diff --git a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.json b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.json
index 13d4daf1..51cbb003 100644
--- a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.json
+++ b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.json
@@ -34,16 +34,16 @@
"CorsOrigins": "https://*.AbpPro.com,http://localhost:4200,http://localhost:3100"
},
"ConnectionStrings": {
- "Default": "Data Source=localhost;Port=3306;Database=LionAbpProDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
+ "Default": "Data Source=43.139.143.143;Port=3306;Database=tenantdb;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
},
"Hangfire": {
"Redis": {
- "Host": "localhost:6379,password=1q2w3E*",
+ "Host": "43.139.143.143:6379,password=1q2w3E*",
"DB": "2"
}
},
"Redis": {
- "Configuration": "localhost:6379,password=1q2w3E*,defaultdatabase=1"
+ "Configuration": "43.139.143.143:6379,password=1q2w3E*,defaultdatabase=5"
},
"Jwt": {
"Audience": "Lion.AbpPro",
@@ -52,11 +52,12 @@
"ExpirationTime": 2
},
"Cap": {
- "Enabled": false,
+ "Enabled": true,
"RabbitMq": {
- "HostName": "localhost",
+ "HostName": "43.139.143.143",
"UserName": "admin",
- "Password": "admin"
+ "Password": "1q2w3E*",
+ "Port": 5672
}
},
"ElasticSearch": {
diff --git a/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.Production.json b/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.Production.json
index 311efd7a..1ffecc3c 100644
--- a/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.Production.json
+++ b/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.Production.json
@@ -1,5 +1,5 @@
{
"ConnectionStrings": {
- "Default": "Data Source=mysql;Port=3306;Database=LionAbpProDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
+ "Default": "Data Source=mysql;Port=3306;Database=tenantdb;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
}
}
\ No newline at end of file
diff --git a/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.json b/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.json
index e711c4f8..ad48919f 100644
--- a/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.json
+++ b/aspnet-core/services/src/Lion.AbpPro.DbMigrator/appsettings.json
@@ -1,5 +1,5 @@
{
"ConnectionStrings": {
- "Default": "Data Source=localhost;Port=3306;Database=LionAbpProDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
+ "Default": "Data Source=43.139.143.143;Port=3306;Database=tenantdb;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
}
}
\ No newline at end of file
diff --git a/aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/Migrations/20240404001711_AddTenantId.Designer.cs b/aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/Migrations/20240404001711_AddTenantId.Designer.cs
new file mode 100644
index 00000000..d7895f7d
--- /dev/null
+++ b/aspnet-core/services/src/Lion.AbpPro.EntityFrameworkCore/Migrations/20240404001711_AddTenantId.Designer.cs
@@ -0,0 +1,2003 @@
+//
+using System;
+using Lion.AbpPro.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Volo.Abp.EntityFrameworkCore;
+
+#nullable disable
+
+namespace Lion.AbpPro.Migrations
+{
+ [DbContext(typeof(AbpProDbContext))]
+ [Migration("20240404001711_AddTenantId")]
+ partial class AddTenantId
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.MySql)
+ .HasAnnotation("ProductVersion", "8.0.0")
+ .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+ modelBuilder.Entity("Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Aggregates.DataDictionary", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("Code")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("varchar(64)");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("char(36)")
+ .HasColumnName("CreatorId");
+
+ b.Property("DeleterId")
+ .HasColumnType("char(36)")
+ .HasColumnName("DeleterId");
+
+ b.Property("DeletionTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("DeletionTime");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasMaxLength(1024)
+ .HasColumnType("varchar(1024)");
+
+ b.Property("DisplayText")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("varchar(64)");
+
+ b.Property("ExtraProperties")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("IsDeleted")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("tinyint(1)")
+ .HasDefaultValue(false)
+ .HasColumnName("IsDeleted");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("char(36)")
+ .HasColumnName("LastModifierId");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.ToTable("AbpDataDictionaries", (string)null);
+ });
+
+ modelBuilder.Entity("Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Aggregates.DataDictionaryDetail", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("Code")
+ .HasColumnType("longtext");
+
+ b.Property("CreationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("char(36)")
+ .HasColumnName("CreatorId");
+
+ b.Property("DataDictionaryId")
+ .HasColumnType("char(36)");
+
+ b.Property("Description")
+ .HasColumnType("longtext");
+
+ b.Property("DisplayText")
+ .HasColumnType("longtext");
+
+ b.Property("IsEnabled")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("char(36)")
+ .HasColumnName("LastModifierId");
+
+ b.Property("Order")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("DataDictionaryId");
+
+ b.ToTable("AbpDataDictionaryDetails", (string)null);
+ });
+
+ modelBuilder.Entity("Lion.AbpPro.LanguageManagement.LanguageTexts.Aggregates.LanguageText", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("char(36)")
+ .HasColumnName("CreatorId");
+
+ b.Property("CultureName")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)")
+ .HasComment("语言名称");
+
+ b.Property("DeleterId")
+ .HasColumnType("char(36)")
+ .HasColumnName("DeleterId");
+
+ b.Property("DeletionTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("DeletionTime");
+
+ b.Property("ExtraProperties")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("IsDeleted")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("tinyint(1)")
+ .HasDefaultValue(false)
+ .HasColumnName("IsDeleted");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("char(36)")
+ .HasColumnName("LastModifierId");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)")
+ .HasComment("名称");
+
+ b.Property("ResourceName")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)")
+ .HasComment("资源名称");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.Property("Value")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)")
+ .HasComment("值");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TenantId", "ResourceName", "CultureName");
+
+ b.ToTable("AbpLanguageTexts", (string)null);
+ });
+
+ modelBuilder.Entity("Lion.AbpPro.LanguageManagement.Languages.Aggregates.Language", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("char(36)")
+ .HasColumnName("CreatorId");
+
+ b.Property("CultureName")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)")
+ .HasComment("语言名称");
+
+ b.Property("DeleterId")
+ .HasColumnType("char(36)")
+ .HasColumnName("DeleterId");
+
+ b.Property("DeletionTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("DeletionTime");
+
+ b.Property("DisplayName")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)")
+ .HasComment("显示名称");
+
+ b.Property("ExtraProperties")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("FlagIcon")
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)")
+ .HasComment("图标");
+
+ b.Property("IsDefault")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("IsDeleted")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("tinyint(1)")
+ .HasDefaultValue(false)
+ .HasColumnName("IsDeleted");
+
+ b.Property("IsEnabled")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("char(36)")
+ .HasColumnName("LastModifierId");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.Property("UiCultureName")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)")
+ .HasComment("Ui语言名称");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CultureName")
+ .IsUnique();
+
+ b.ToTable("AbpLanguages", (string)null);
+ });
+
+ modelBuilder.Entity("Lion.AbpPro.NotificationManagement.Notifications.Aggregates.Notification", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("Content")
+ .IsRequired()
+ .HasMaxLength(1024)
+ .HasColumnType("varchar(1024)");
+
+ b.Property("CreationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("char(36)")
+ .HasColumnName("CreatorId");
+
+ b.Property("DeleterId")
+ .HasColumnType("char(36)")
+ .HasColumnName("DeleterId");
+
+ b.Property("DeletionTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("DeletionTime");
+
+ b.Property("ExtraProperties")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("IsDeleted")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("tinyint(1)")
+ .HasDefaultValue(false)
+ .HasColumnName("IsDeleted");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("char(36)")
+ .HasColumnName("LastModifierId");
+
+ b.Property("MessageLevel")
+ .HasColumnType("int");
+
+ b.Property("MessageType")
+ .HasColumnType("int");
+
+ b.Property("SenderId")
+ .HasColumnType("char(36)");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)");
+
+ b.HasKey("Id");
+
+ b.ToTable("AbpNotifications", (string)null);
+ });
+
+ modelBuilder.Entity("Lion.AbpPro.NotificationManagement.Notifications.Aggregates.NotificationSubscription", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("CreationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("char(36)")
+ .HasColumnName("CreatorId");
+
+ b.Property("DeleterId")
+ .HasColumnType("char(36)")
+ .HasColumnName("DeleterId");
+
+ b.Property("DeletionTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("DeletionTime");
+
+ b.Property("IsDeleted")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("tinyint(1)")
+ .HasDefaultValue(false)
+ .HasColumnName("IsDeleted");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("char(36)")
+ .HasColumnName("LastModifierId");
+
+ b.Property("NotificationId")
+ .HasColumnType("char(36)");
+
+ b.Property("Read")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("ReadTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("ReceiveId")
+ .HasColumnType("char(36)");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("NotificationId");
+
+ b.ToTable("AbpNotificationSubscriptions", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("ApplicationName")
+ .HasMaxLength(96)
+ .HasColumnType("varchar(96)")
+ .HasColumnName("ApplicationName");
+
+ b.Property("BrowserInfo")
+ .HasMaxLength(512)
+ .HasColumnType("varchar(512)")
+ .HasColumnName("BrowserInfo");
+
+ b.Property("ClientId")
+ .HasMaxLength(64)
+ .HasColumnType("varchar(64)")
+ .HasColumnName("ClientId");
+
+ b.Property("ClientIpAddress")
+ .HasMaxLength(64)
+ .HasColumnType("varchar(64)")
+ .HasColumnName("ClientIpAddress");
+
+ b.Property("ClientName")
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)")
+ .HasColumnName("ClientName");
+
+ b.Property("Comments")
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)")
+ .HasColumnName("Comments");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CorrelationId")
+ .HasMaxLength(64)
+ .HasColumnType("varchar(64)")
+ .HasColumnName("CorrelationId");
+
+ b.Property("Exceptions")
+ .HasColumnType("longtext");
+
+ b.Property("ExecutionDuration")
+ .HasColumnType("int")
+ .HasColumnName("ExecutionDuration");
+
+ b.Property("ExecutionTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("ExtraProperties")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("HttpMethod")
+ .HasMaxLength(16)
+ .HasColumnType("varchar(16)")
+ .HasColumnName("HttpMethod");
+
+ b.Property("HttpStatusCode")
+ .HasColumnType("int")
+ .HasColumnName("HttpStatusCode");
+
+ b.Property("ImpersonatorTenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("ImpersonatorTenantId");
+
+ b.Property("ImpersonatorTenantName")
+ .HasMaxLength(64)
+ .HasColumnType("varchar(64)")
+ .HasColumnName("ImpersonatorTenantName");
+
+ b.Property("ImpersonatorUserId")
+ .HasColumnType("char(36)")
+ .HasColumnName("ImpersonatorUserId");
+
+ b.Property("ImpersonatorUserName")
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)")
+ .HasColumnName("ImpersonatorUserName");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.Property("TenantName")
+ .HasMaxLength(64)
+ .HasColumnType("varchar(64)")
+ .HasColumnName("TenantName");
+
+ b.Property("Url")
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)")
+ .HasColumnName("Url");
+
+ b.Property("UserId")
+ .HasColumnType("char(36)")
+ .HasColumnName("UserId");
+
+ b.Property("UserName")
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)")
+ .HasColumnName("UserName");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TenantId", "ExecutionTime");
+
+ b.HasIndex("TenantId", "UserId", "ExecutionTime");
+
+ b.ToTable("AbpAuditLogs", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("AuditLogId")
+ .HasColumnType("char(36)")
+ .HasColumnName("AuditLogId");
+
+ b.Property("ExecutionDuration")
+ .HasColumnType("int")
+ .HasColumnName("ExecutionDuration");
+
+ b.Property("ExecutionTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("ExecutionTime");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("MethodName")
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)")
+ .HasColumnName("MethodName");
+
+ b.Property("Parameters")
+ .HasMaxLength(2000)
+ .HasColumnType("varchar(2000)")
+ .HasColumnName("Parameters");
+
+ b.Property("ServiceName")
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)")
+ .HasColumnName("ServiceName");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuditLogId");
+
+ b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime");
+
+ b.ToTable("AbpAuditLogActions", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("AuditLogId")
+ .HasColumnType("char(36)")
+ .HasColumnName("AuditLogId");
+
+ b.Property("ChangeTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("ChangeTime");
+
+ b.Property("ChangeType")
+ .HasColumnType("tinyint unsigned")
+ .HasColumnName("ChangeType");
+
+ b.Property("EntityId")
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)")
+ .HasColumnName("EntityId");
+
+ b.Property("EntityTenantId")
+ .HasColumnType("char(36)");
+
+ b.Property("EntityTypeFullName")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)")
+ .HasColumnName("EntityTypeFullName");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuditLogId");
+
+ b.HasIndex("TenantId", "EntityTypeFullName", "EntityId");
+
+ b.ToTable("AbpEntityChanges", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("EntityChangeId")
+ .HasColumnType("char(36)");
+
+ b.Property("NewValue")
+ .HasMaxLength(512)
+ .HasColumnType("varchar(512)")
+ .HasColumnName("NewValue");
+
+ b.Property("OriginalValue")
+ .HasMaxLength(512)
+ .HasColumnType("varchar(512)")
+ .HasColumnName("OriginalValue");
+
+ b.Property("PropertyName")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)")
+ .HasColumnName("PropertyName");
+
+ b.Property("PropertyTypeFullName")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("varchar(64)")
+ .HasColumnName("PropertyTypeFullName");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EntityChangeId");
+
+ b.ToTable("AbpEntityPropertyChanges", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("CreationTime");
+
+ b.Property("ExtraProperties")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("IsAbandoned")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("tinyint(1)")
+ .HasDefaultValue(false);
+
+ b.Property("JobArgs")
+ .IsRequired()
+ .HasMaxLength(1048576)
+ .HasColumnType("longtext");
+
+ b.Property("JobName")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)");
+
+ b.Property("LastTryTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("NextTryTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Priority")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("tinyint unsigned")
+ .HasDefaultValue((byte)15);
+
+ b.Property("TryCount")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("smallint")
+ .HasDefaultValue((short)0);
+
+ b.HasKey("Id");
+
+ b.HasIndex("IsAbandoned", "NextTryTime");
+
+ b.ToTable("AbpBackgroundJobs", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("AllowedProviders")
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)");
+
+ b.Property("DefaultValue")
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)");
+
+ b.Property("Description")
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)");
+
+ b.Property("DisplayName")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("GroupName")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)");
+
+ b.Property("IsAvailableToHost")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("IsVisibleToClients")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)");
+
+ b.Property("ParentName")
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)");
+
+ b.Property("ValueType")
+ .HasMaxLength(2048)
+ .HasColumnType("varchar(2048)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GroupName");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("AbpFeatures", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureGroupDefinitionRecord", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("DisplayName")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("AbpFeatureGroups", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)");
+
+ b.Property("ProviderKey")
+ .HasMaxLength(64)
+ .HasColumnType("varchar(64)");
+
+ b.Property("ProviderName")
+ .HasMaxLength(64)
+ .HasColumnType("varchar(64)");
+
+ b.Property("Value")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name", "ProviderName", "ProviderKey")
+ .IsUnique();
+
+ b.ToTable("AbpFeatureValues", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("Description")
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)");
+
+ b.Property("ExtraProperties")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("IsStatic")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)");
+
+ b.Property("Regex")
+ .HasMaxLength(512)
+ .HasColumnType("varchar(512)");
+
+ b.Property("RegexDescription")
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)");
+
+ b.Property("Required")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("ValueType")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.ToTable("AbpClaimTypes", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("SourceTenantId")
+ .HasColumnType("char(36)");
+
+ b.Property("SourceUserId")
+ .HasColumnType("char(36)");
+
+ b.Property("TargetTenantId")
+ .HasColumnType("char(36)");
+
+ b.Property("TargetUserId")
+ .HasColumnType("char(36)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId")
+ .IsUnique();
+
+ b.ToTable("AbpLinkUsers", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("EntityVersion")
+ .HasColumnType("int");
+
+ b.Property("ExtraProperties")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("IsDefault")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("IsDefault");
+
+ b.Property("IsPublic")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("IsPublic");
+
+ b.Property("IsStatic")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("IsStatic");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)");
+
+ b.Property("NormalizedName")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedName");
+
+ b.ToTable("AbpRoles", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("ClaimType")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)");
+
+ b.Property("ClaimValue")
+ .HasMaxLength(1024)
+ .HasColumnType("varchar(1024)");
+
+ b.Property("RoleId")
+ .HasColumnType("char(36)");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AbpRoleClaims", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("char(36)");
+
+ b.Property("Action")
+ .HasMaxLength(96)
+ .HasColumnType("varchar(96)");
+
+ b.Property("ApplicationName")
+ .HasMaxLength(96)
+ .HasColumnType("varchar(96)");
+
+ b.Property("BrowserInfo")
+ .HasMaxLength(512)
+ .HasColumnType("varchar(512)");
+
+ b.Property("ClientId")
+ .HasMaxLength(64)
+ .HasColumnType("varchar(64)");
+
+ b.Property("ClientIpAddress")
+ .HasMaxLength(64)
+ .HasColumnType("varchar(64)");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CorrelationId")
+ .HasMaxLength(64)
+ .HasColumnType("varchar(64)");
+
+ b.Property("CreationTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("ExtraProperties")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("Identity")
+ .HasMaxLength(96)
+ .HasColumnType("varchar(96)");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.Property("TenantName")
+ .HasMaxLength(64)
+ .HasColumnType("varchar(64)");
+
+ b.Property("UserId")
+ .HasColumnType("char(36)");
+
+ b.Property("UserName")
+ .HasMaxLength(256)
+ .HasColumnType("varchar(256)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TenantId", "Action");
+
+ b.HasIndex("TenantId", "ApplicationName");
+
+ b.HasIndex("TenantId", "Identity");
+
+ b.HasIndex("TenantId", "UserId");
+
+ b.ToTable("AbpSecurityLogs", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b =>
+ {
+ b.Property