修复用户角色替换的软删除冲突

This commit is contained in:
2025-12-27 10:08:09 +08:00
parent 0d1db9a11a
commit c9980ef237

View File

@@ -61,19 +61,40 @@ public sealed class EfUserRoleRepository(IdentityDbContext dbContext) : IUserRol
.Where(x => x.TenantId == tenantId && x.UserId == userId) .Where(x => x.TenantId == tenantId && x.UserId == userId)
.ToListAsync(cancellationToken); .ToListAsync(cancellationToken);
// 3. 清空并保存 // 3. 去重并构建目标集合
dbContext.UserRoles.RemoveRange(existing); var targetRoleIds = roleIds.Distinct().ToArray();
await dbContext.SaveChangesAsync(cancellationToken); var targetRoleSet = targetRoleIds.ToHashSet();
var existingRoleMap = existing.ToDictionary(x => x.RoleId);
// 4. 构建新映射 // 4. 同步现有映射状态(软删除或恢复)
var toAdd = roleIds.Distinct().Select(roleId => new UserRole foreach (var mapping in existing)
{ {
TenantId = tenantId, if (targetRoleSet.Contains(mapping.RoleId))
UserId = userId, {
RoleId = 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.UserRoles.AddRangeAsync(toAdd, cancellationToken);
await dbContext.SaveChangesAsync(cancellationToken); await dbContext.SaveChangesAsync(cancellationToken);