diff --git a/src/PearAdmin.AbpTemplate.Admin/Program.cs b/src/PearAdmin.AbpTemplate.Admin/Program.cs index 315ca8e7dc047bd6efbf7157ba4437d470c3132e..f5be82ba72bfaf312cbc5e72b6bb4749daabe0cb 100644 --- a/src/PearAdmin.AbpTemplate.Admin/Program.cs +++ b/src/PearAdmin.AbpTemplate.Admin/Program.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Logging; namespace PearAdmin.AbpTemplate.Admin { @@ -14,6 +15,15 @@ namespace PearAdmin.AbpTemplate.Admin { return WebHost.CreateDefaultBuilder(args) .UseStartup() + .ConfigureLogging((hostingContext, logging) => + { + logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")) + .AddDebug() + .AddEventSourceLogger() + .AddFilter("System", LogLevel.Debug) + .AddFilter("Microsoft.EntityFrameworkCore.*", LogLevel.Warning) + .AddFilter("Microsoft.AspNetCore.*", LogLevel.Error); + }) .Build(); } } diff --git a/src/PearAdmin.AbpTemplate.Admin/appsettings.Production.json b/src/PearAdmin.AbpTemplate.Admin/appsettings.Production.json new file mode 100644 index 0000000000000000000000000000000000000000..96289c09060539f48dcfec22e7cd884204c86c64 --- /dev/null +++ b/src/PearAdmin.AbpTemplate.Admin/appsettings.Production.json @@ -0,0 +1,9 @@ +{ + "ConnectionStrings": { + "Default": "", + "Redis": "" + }, + "App": { + "WebSiteRootAddress": "http://localhost:9527/" + } +} diff --git a/src/PearAdmin.AbpTemplate.Admin/appsettings.Stage.json b/src/PearAdmin.AbpTemplate.Admin/appsettings.Stage.json new file mode 100644 index 0000000000000000000000000000000000000000..96289c09060539f48dcfec22e7cd884204c86c64 --- /dev/null +++ b/src/PearAdmin.AbpTemplate.Admin/appsettings.Stage.json @@ -0,0 +1,9 @@ +{ + "ConnectionStrings": { + "Default": "", + "Redis": "" + }, + "App": { + "WebSiteRootAddress": "http://localhost:9527/" + } +} diff --git a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/AbpTemplateEntityFrameworkModule.cs b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/AbpTemplateEntityFrameworkModule.cs index 5b8acbb77d49e0279cde4956c7bee9ae508b5f40..44ee59664c95f419e63778d1d69b7325dcffafef 100644 --- a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/AbpTemplateEntityFrameworkModule.cs +++ b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/AbpTemplateEntityFrameworkModule.cs @@ -7,31 +7,33 @@ using PearAdmin.AbpTemplate.EntityFrameworkCore.Seed; namespace PearAdmin.AbpTemplate.EntityFrameworkCore { [DependsOn( - typeof(AbpTemplateCoreModule), + typeof(AbpTemplateCoreModule), typeof(AbpZeroCoreEntityFrameworkCoreModule))] public class AbpTemplateEntityFrameworkModule : AbpModule { - /* Used it tests to skip dbcontext registration, in order to use in-memory database of EF Core */ + // 集成测试中使用,跳过DbContext注册和基础数据初始化 + // 集成测试时使用内存数据库 public bool SkipDbContextRegistration { get; set; } - public bool SkipDbSeed { get; set; } public override void PreInitialize() { - if (!SkipDbContextRegistration) + if (SkipDbContextRegistration) { - Configuration.Modules.AbpEfCore().AddDbContext(options => - { - if (options.ExistingConnection != null) - { - AbpTemplateDbContextConfigurer.Configure(options.DbContextOptions, options.ExistingConnection); - } - else - { - AbpTemplateDbContextConfigurer.Configure(options.DbContextOptions, options.ConnectionString); - } - }); + return; } + + Configuration.Modules.AbpEfCore().AddDbContext(options => + { + if (options.ExistingConnection != null) + { + AbpTemplateDbContextConfigurer.Configure(options.DbContextOptions, options.ExistingConnection); + } + else + { + AbpTemplateDbContextConfigurer.Configure(options.DbContextOptions, options.ConnectionString); + } + }); } public override void Initialize() @@ -41,10 +43,12 @@ namespace PearAdmin.AbpTemplate.EntityFrameworkCore public override void PostInitialize() { - if (!SkipDbSeed) + if (SkipDbSeed) { - SeedHelper.SeedHostDb(IocManager); + return; } + + SeedHelper.SeedHostDb(IocManager); } } } diff --git a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/DefaultLanguagesCreator.cs b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Common/DefaultLanguagesCreator.cs similarity index 53% rename from src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/DefaultLanguagesCreator.cs rename to src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Common/DefaultLanguagesCreator.cs index 38727280ced985c6f3a0e3c13509a66d3a29c576..64cae4ba5fcbcc61445422683e247a4739f8f311 100644 --- a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/DefaultLanguagesCreator.cs +++ b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Common/DefaultLanguagesCreator.cs @@ -1,40 +1,35 @@ using System.Collections.Generic; using System.Linq; -using Microsoft.EntityFrameworkCore; using Abp.Localization; -using Abp.MultiTenancy; +using Microsoft.EntityFrameworkCore; -namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Host +namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Common { public class DefaultLanguagesCreator { - public static List InitialLanguages => GetInitialLanguages(); - private readonly AbpTemplateDbContext _context; + private readonly int? _tenantId; - private static List GetInitialLanguages() - { - var tenantId = AbpTemplateCoreConsts.MultiTenancyEnabled ? null : (int?)MultiTenancyConsts.DefaultTenantId; - return new List - { - new ApplicationLanguage(tenantId, "zh-Hans", "简体中文", "famfamfam-flags cn"), - new ApplicationLanguage(tenantId, "en", "English", "famfamfam-flags us") - }; - } - - public DefaultLanguagesCreator(AbpTemplateDbContext context) + public DefaultLanguagesCreator(AbpTemplateDbContext context, int? tenantId = null) { _context = context; + _tenantId = tenantId; } public void Create() { - CreateLanguages(); + CreateDefaultLanguage(); } - private void CreateLanguages() + private void CreateDefaultLanguage() { - foreach (var language in InitialLanguages) + var initialLanguages = new List + { + new ApplicationLanguage(_tenantId, "zh-Hans", "简体中文", "famfamfam-flags cn"), + new ApplicationLanguage(_tenantId, "en", "English", "famfamfam-flags us") + }; + + foreach (var language in initialLanguages) { AddLanguageIfNotExists(language); } diff --git a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/DefaultSettingsCreator.cs b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Common/DefaultSettingsCreator.cs similarity index 69% rename from src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/DefaultSettingsCreator.cs rename to src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Common/DefaultSettingsCreator.cs index c6c9891f3266588133a3046709b911e3b4f677ba..e9a04124c0ac54a1bf84d2c28be6acb96ec39d36 100644 --- a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/DefaultSettingsCreator.cs +++ b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Common/DefaultSettingsCreator.cs @@ -1,36 +1,36 @@ using System.Linq; -using Microsoft.EntityFrameworkCore; using Abp.Configuration; using Abp.Localization; using Abp.MultiTenancy; using Abp.Net.Mail; +using Microsoft.EntityFrameworkCore; -namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Host +namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Common { public class DefaultSettingsCreator { private readonly AbpTemplateDbContext _context; + private readonly int? _tenantId; - public DefaultSettingsCreator(AbpTemplateDbContext context) + public DefaultSettingsCreator(AbpTemplateDbContext context, int? tenantId = null) { _context = context; + _tenantId = tenantId; } public void Create() { - int? tenantId = null; - - if (AbpTemplateCoreConsts.MultiTenancyEnabled == false) - { - tenantId = MultiTenancyConsts.DefaultTenantId; - } + CreateDefaultSetting(); + } - // Emailing - AddSettingIfNotExists(EmailSettingNames.DefaultFromAddress, "admin@mydomain.com", tenantId); - AddSettingIfNotExists(EmailSettingNames.DefaultFromDisplayName, "mydomain.com mailer", tenantId); + private void CreateDefaultSetting() + { + // 邮箱设置 + AddSettingIfNotExists(EmailSettingNames.DefaultFromAddress, "admin@mydomain.com", _tenantId); + AddSettingIfNotExists(EmailSettingNames.DefaultFromDisplayName, "mydomain.com mailer", _tenantId); - // Languages - AddSettingIfNotExists(LocalizationSettingNames.DefaultLanguage, "zh-Hans", tenantId); + // 语言设置 + AddSettingIfNotExists(LocalizationSettingNames.DefaultLanguage, "zh-Hans", _tenantId); } private void AddSettingIfNotExists(string name, string value, int? tenantId = null) diff --git a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/DefaultEditionCreator.cs b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/DefaultEditionCreator.cs index 61268fe6556f90c639899e24e731e7360481d29f..73511824882ee58766d66b6c05ed38ee989941d2 100644 --- a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/DefaultEditionCreator.cs +++ b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/DefaultEditionCreator.cs @@ -1,7 +1,7 @@ using System.Linq; -using Microsoft.EntityFrameworkCore; using Abp.Application.Editions; using Abp.Application.Features; +using Microsoft.EntityFrameworkCore; using PearAdmin.AbpTemplate.Editions; namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Host @@ -22,14 +22,19 @@ namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Host private void CreateEditions() { + // 初始化默认版本 var defaultEdition = _context.Editions.IgnoreQueryFilters().FirstOrDefault(e => e.Name == EditionManager.DefaultEditionName); if (defaultEdition == null) { - defaultEdition = new Edition { Name = EditionManager.DefaultEditionName, DisplayName = EditionManager.DefaultEditionName }; + defaultEdition = new Edition() + { + Name = EditionManager.DefaultEditionName, + DisplayName = EditionManager.DefaultEditionName + }; _context.Editions.Add(defaultEdition); _context.SaveChanges(); - /* Add desired features to the standard edition, if wanted... */ + // 为当前默认版本添加初始功能 } } diff --git a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/HostRoleAndUserCreator.cs b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/HostRoleAndUserCreator.cs index bd5826d33ed50fd04111a6b9c3aa3a8d0af06dff..d94ca6aff8573c42053bfc0bc2e8590600e894fb 100644 --- a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/HostRoleAndUserCreator.cs +++ b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/HostRoleAndUserCreator.cs @@ -1,14 +1,14 @@ using System.Linq; -using Microsoft.EntityFrameworkCore; using Abp.Authorization; using Abp.Authorization.Roles; using Abp.Authorization.Users; using Abp.MultiTenancy; +using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; using PearAdmin.AbpTemplate.Authorization; using PearAdmin.AbpTemplate.Authorization.Roles; using PearAdmin.AbpTemplate.Authorization.Users; -using Microsoft.AspNetCore.Identity; -using Microsoft.Extensions.Options; namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Host { @@ -28,16 +28,20 @@ namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Host private void CreateHostRoleAndUsers() { - // Admin role for host + // 为宿主创建管理员角色 var adminRoleForHost = _context.Roles.IgnoreQueryFilters().FirstOrDefault(r => r.TenantId == null && r.Name == StaticRoleNames.Host.Admin); if (adminRoleForHost == null) { - adminRoleForHost = _context.Roles.Add(new Role(null, StaticRoleNames.Host.Admin) { IsStatic = true, IsDefault = true }).Entity; + adminRoleForHost = _context.Roles.Add(new Role(null, StaticRoleNames.Host.Admin) + { + IsStatic = true, + IsDefault = true + }).Entity; _context.SaveChanges(); } - // Grant all permissions to admin role for host + // 为宿主管理员角色分配宿主所有权限 var grantedPermissions = _context.Permissions.IgnoreQueryFilters() .OfType() @@ -47,8 +51,7 @@ namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Host var permissions = PermissionFinder .GetAllPermissions(new AppPermissionProvider()) - .Where(p => p.MultiTenancySides.HasFlag(MultiTenancySides.Host) && - !grantedPermissions.Contains(p.Name)) + .Where(p => p.MultiTenancySides.HasFlag(MultiTenancySides.Host) && !grantedPermissions.Contains(p.Name)) .ToList(); if (permissions.Any()) @@ -65,7 +68,7 @@ namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Host _context.SaveChanges(); } - // Admin user for host + // 为宿主创建管理员用户 var adminUserForHost = _context.Users.IgnoreQueryFilters().FirstOrDefault(u => u.TenantId == null && u.UserName == AbpUserBase.AdminUserName); if (adminUserForHost == null) @@ -87,11 +90,9 @@ namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Host adminUserForHost = _context.Users.Add(user).Entity; _context.SaveChanges(); - // Assign Admin role to admin user + // 为宿主管理员用户分配宿主管理员角色 _context.UserRoles.Add(new UserRole(null, adminUserForHost.Id, adminRoleForHost.Id)); _context.SaveChanges(); - - _context.SaveChanges(); } } } diff --git a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/InitialHostDbBuilder.cs b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/InitialHostDbBuilder.cs index fc282d410975a4adef5a7dd6ff4b0f4ed44ba1da..a0548f490a268b88d9c4ec5415be69f5461b7b75 100644 --- a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/InitialHostDbBuilder.cs +++ b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/InitialHostDbBuilder.cs @@ -1,4 +1,6 @@ -namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Host +using PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Common; + +namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Host { public class InitialHostDbBuilder { @@ -12,8 +14,8 @@ public void Create() { new DefaultEditionCreator(_context).Create(); - new DefaultLanguagesCreator(_context).Create(); new HostRoleAndUserCreator(_context).Create(); + new DefaultLanguagesCreator(_context).Create(); new DefaultSettingsCreator(_context).Create(); _context.SaveChanges(); diff --git a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/SeedHelper.cs b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/SeedHelper.cs index 645b80747216900b28a62e5e14961fa2f312b753..b3a9886e7e2a27b48948573367c1078696e2b5e6 100644 --- a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/SeedHelper.cs +++ b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/SeedHelper.cs @@ -1,10 +1,10 @@ using System; using System.Transactions; -using Microsoft.EntityFrameworkCore; using Abp.Dependency; using Abp.Domain.Uow; using Abp.EntityFrameworkCore.Uow; using Abp.MultiTenancy; +using Microsoft.EntityFrameworkCore; using PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Host; using PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Tenants; @@ -21,12 +21,9 @@ namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed { context.SuppressAutoSetTenantId = true; - // Host seed + // 宿主基础数据初始化 new InitialHostDbBuilder(context).Create(); - - // Default tenant seed (in host database). - new DefaultTenantBuilder(context).Create(); - new TenantRoleAndUserBuilder(context, MultiTenancyConsts.DefaultTenantId).Create(); + new InitialTenantDbBuilder(context).Create(); } private static void WithDbContext(IIocResolver iocResolver, Action contextAction) diff --git a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Tenants/DefaultTenantBuilder.cs b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Tenants/DefaultTenantBuilder.cs index f4e8a0eaec7a15799abfd346dc7fefff5a1d619e..38df8cd297ce2c78337e9b6f1124d32a8fe3854a 100644 --- a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Tenants/DefaultTenantBuilder.cs +++ b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Tenants/DefaultTenantBuilder.cs @@ -22,7 +22,7 @@ namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Tenants private void CreateDefaultTenant() { - // Default tenant + // 创建默认租户(1) var defaultTenant = _context.Tenants.IgnoreQueryFilters().FirstOrDefault(t => t.TenancyName == AbpTenantBase.DefaultTenantName); if (defaultTenant == null) diff --git a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Tenants/InitialTenantDbBuilder.cs b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Tenants/InitialTenantDbBuilder.cs new file mode 100644 index 0000000000000000000000000000000000000000..a3dcac8387b409144b78005f0dd6aa0de9088fa1 --- /dev/null +++ b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Tenants/InitialTenantDbBuilder.cs @@ -0,0 +1,31 @@ +using Abp.MultiTenancy; +using PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Common; + +namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Tenants +{ + public class InitialTenantDbBuilder + { + private readonly AbpTemplateDbContext _context; + + public InitialTenantDbBuilder(AbpTemplateDbContext context) + { + _context = context; + } + + public void Create() + { + //默认租户初始化(Id为1) + DefaultTenant(); + + _context.SaveChanges(); + } + + private void DefaultTenant() + { + new DefaultTenantBuilder(_context).Create(); + new TenantRoleAndUserBuilder(_context, MultiTenancyConsts.DefaultTenantId).Create(); + new DefaultLanguagesCreator(_context, MultiTenancyConsts.DefaultTenantId).Create(); + new DefaultSettingsCreator(_context, MultiTenancyConsts.DefaultTenantId).Create(); + } + } +} diff --git a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Tenants/TenantRoleAndUserBuilder.cs b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Tenants/TenantRoleAndUserBuilder.cs index f611e13c18e7b6c43b4955217f85cde04f911e49..2da93702d006109ba0c8fe6fa92f7a2c83d94011 100644 --- a/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Tenants/TenantRoleAndUserBuilder.cs +++ b/src/PearAdmin.AbpTemplate.EntityFrameworkCore/EntityFrameworkCore/Seed/Tenants/TenantRoleAndUserBuilder.cs @@ -1,11 +1,11 @@ using System.Linq; -using Microsoft.AspNetCore.Identity; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Options; using Abp.Authorization; using Abp.Authorization.Roles; using Abp.Authorization.Users; using Abp.MultiTenancy; +using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; using PearAdmin.AbpTemplate.Authorization; using PearAdmin.AbpTemplate.Authorization.Roles; using PearAdmin.AbpTemplate.Authorization.Users; @@ -30,7 +30,7 @@ namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Tenants private void CreateRolesAndUsers() { - // Admin role + // 创建租户管理员角色 var adminRole = _context.Roles.IgnoreQueryFilters().FirstOrDefault(r => r.TenantId == _tenantId && r.Name == StaticRoleNames.Tenants.Admin); if (adminRole == null) @@ -39,7 +39,7 @@ namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Tenants _context.SaveChanges(); } - // Grant all permissions to admin role + // 为租户管理员角色赋予所有权限 var grantedPermissions = _context.Permissions.IgnoreQueryFilters() .OfType() @@ -67,7 +67,7 @@ namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Tenants _context.SaveChanges(); } - // Admin user + // 创建租户管理员用户 var adminUser = _context.Users.IgnoreQueryFilters().FirstOrDefault(u => u.TenantId == _tenantId && u.UserName == AbpUserBase.AdminUserName); if (adminUser == null) @@ -80,7 +80,7 @@ namespace PearAdmin.AbpTemplate.EntityFrameworkCore.Seed.Tenants _context.Users.Add(adminUser); _context.SaveChanges(); - // Assign Admin role to admin user + // 为租户管理员用户分配管理员角色 _context.UserRoles.Add(new UserRole(_tenantId, adminUser.Id, adminRole.Id)); _context.SaveChanges(); }