修复用户角色替换的软删除冲突
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user