From 9df54d620d7f26806ade3adc0e0529a5dddbf61d Mon Sep 17 00:00:00 2001 From: MSuMshk <2039814060@qq.com> Date: Sat, 27 Dec 2025 10:08:09 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E6=9B=BF=E6=8D=A2=E7=9A=84=E8=BD=AF=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Persistence/EfUserRoleRepository.cs | 41 ++++++++++++++----- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/src/Infrastructure/TakeoutSaaS.Infrastructure/Identity/Persistence/EfUserRoleRepository.cs b/src/Infrastructure/TakeoutSaaS.Infrastructure/Identity/Persistence/EfUserRoleRepository.cs index c82e62e..3bb62af 100644 --- a/src/Infrastructure/TakeoutSaaS.Infrastructure/Identity/Persistence/EfUserRoleRepository.cs +++ b/src/Infrastructure/TakeoutSaaS.Infrastructure/Identity/Persistence/EfUserRoleRepository.cs @@ -61,19 +61,40 @@ public sealed class EfUserRoleRepository(IdentityDbContext dbContext) : IUserRol .Where(x => x.TenantId == tenantId && x.UserId == userId) .ToListAsync(cancellationToken); - // 3. 清空并保存 - dbContext.UserRoles.RemoveRange(existing); - await dbContext.SaveChangesAsync(cancellationToken); + // 3. 去重并构建目标集合 + var targetRoleIds = roleIds.Distinct().ToArray(); + var targetRoleSet = targetRoleIds.ToHashSet(); + var existingRoleMap = existing.ToDictionary(x => x.RoleId); - // 4. 构建新映射 - var toAdd = roleIds.Distinct().Select(roleId => new UserRole + // 4. 同步现有映射状态(软删除或恢复) + foreach (var mapping in existing) { - TenantId = tenantId, - UserId = userId, - RoleId = roleId - }); + if (targetRoleSet.Contains(mapping.RoleId)) + { + if (mapping.DeletedAt.HasValue) + { + mapping.DeletedAt = null; + mapping.DeletedBy = null; + } + continue; + } + + if (!mapping.DeletedAt.HasValue) + { + dbContext.UserRoles.Remove(mapping); + } + } + + // 5. 补齐新增角色映射 + var toAdd = targetRoleIds + .Where(roleId => !existingRoleMap.ContainsKey(roleId)) + .Select(roleId => new UserRole + { + TenantId = tenantId, + UserId = userId, + RoleId = roleId + }); - // 5. 批量新增并保存 await dbContext.UserRoles.AddRangeAsync(toAdd, cancellationToken); await dbContext.SaveChangesAsync(cancellationToken);