fix: wrap role/user permission replacements in transactions

This commit is contained in:
2025-12-06 14:27:23 +08:00
parent 3b68b62bb6
commit 4120aec055
2 changed files with 10 additions and 0 deletions

View File

@@ -28,11 +28,14 @@ public sealed class EfRolePermissionRepository(IdentityDbContext dbContext) : IR
public async Task ReplaceRolePermissionsAsync(long tenantId, long roleId, IEnumerable<long> permissionIds, CancellationToken cancellationToken = default) public async Task ReplaceRolePermissionsAsync(long tenantId, long roleId, IEnumerable<long> permissionIds, CancellationToken cancellationToken = default)
{ {
await using var trx = await dbContext.Database.BeginTransactionAsync(cancellationToken);
var existing = await dbContext.RolePermissions var existing = await dbContext.RolePermissions
.Where(x => x.TenantId == tenantId && x.RoleId == roleId) .Where(x => x.TenantId == tenantId && x.RoleId == roleId)
.ToListAsync(cancellationToken); .ToListAsync(cancellationToken);
dbContext.RolePermissions.RemoveRange(existing); dbContext.RolePermissions.RemoveRange(existing);
await dbContext.SaveChangesAsync(cancellationToken);
var toAdd = permissionIds.Distinct().Select(permissionId => new RolePermission var toAdd = permissionIds.Distinct().Select(permissionId => new RolePermission
{ {
@@ -42,6 +45,8 @@ public sealed class EfRolePermissionRepository(IdentityDbContext dbContext) : IR
}); });
await dbContext.RolePermissions.AddRangeAsync(toAdd, cancellationToken); await dbContext.RolePermissions.AddRangeAsync(toAdd, cancellationToken);
await dbContext.SaveChangesAsync(cancellationToken);
await trx.CommitAsync(cancellationToken);
} }
public Task SaveChangesAsync(CancellationToken cancellationToken = default) public Task SaveChangesAsync(CancellationToken cancellationToken = default)

View File

@@ -23,11 +23,14 @@ public sealed class EfUserRoleRepository(IdentityDbContext dbContext) : IUserRol
public async Task ReplaceUserRolesAsync(long tenantId, long userId, IEnumerable<long> roleIds, CancellationToken cancellationToken = default) public async Task ReplaceUserRolesAsync(long tenantId, long userId, IEnumerable<long> roleIds, CancellationToken cancellationToken = default)
{ {
await using var trx = await dbContext.Database.BeginTransactionAsync(cancellationToken);
var existing = await dbContext.UserRoles var existing = await dbContext.UserRoles
.Where(x => x.TenantId == tenantId && x.UserId == userId) .Where(x => x.TenantId == tenantId && x.UserId == userId)
.ToListAsync(cancellationToken); .ToListAsync(cancellationToken);
dbContext.UserRoles.RemoveRange(existing); dbContext.UserRoles.RemoveRange(existing);
await dbContext.SaveChangesAsync(cancellationToken);
var toAdd = roleIds.Distinct().Select(roleId => new UserRole var toAdd = roleIds.Distinct().Select(roleId => new UserRole
{ {
@@ -37,6 +40,8 @@ public sealed class EfUserRoleRepository(IdentityDbContext dbContext) : IUserRol
}); });
await dbContext.UserRoles.AddRangeAsync(toAdd, cancellationToken); await dbContext.UserRoles.AddRangeAsync(toAdd, cancellationToken);
await dbContext.SaveChangesAsync(cancellationToken);
await trx.CommitAsync(cancellationToken);
} }
public Task SaveChangesAsync(CancellationToken cancellationToken = default) public Task SaveChangesAsync(CancellationToken cancellationToken = default)