fix: wrap identity permission bindings with execution strategy transactions

This commit is contained in:
2025-12-06 14:35:06 +08:00
parent 4120aec055
commit ab4e407f9c
3 changed files with 75 additions and 58 deletions

View File

@@ -28,25 +28,30 @@ public sealed class EfRolePermissionRepository(IdentityDbContext dbContext) : IR
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
.Where(x => x.TenantId == tenantId && x.RoleId == roleId)
.ToListAsync(cancellationToken);
dbContext.RolePermissions.RemoveRange(existing);
await dbContext.SaveChangesAsync(cancellationToken);
var toAdd = permissionIds.Distinct().Select(permissionId => new RolePermission
var strategy = dbContext.Database.CreateExecutionStrategy();
await strategy.ExecuteAsync(async () =>
{
TenantId = tenantId,
RoleId = roleId,
PermissionId = permissionId
});
await using var trx = await dbContext.Database.BeginTransactionAsync(cancellationToken);
await dbContext.RolePermissions.AddRangeAsync(toAdd, cancellationToken);
await dbContext.SaveChangesAsync(cancellationToken);
await trx.CommitAsync(cancellationToken);
var existing = await dbContext.RolePermissions
.Where(x => x.TenantId == tenantId && x.RoleId == roleId)
.ToListAsync(cancellationToken);
dbContext.RolePermissions.RemoveRange(existing);
await dbContext.SaveChangesAsync(cancellationToken);
var toAdd = permissionIds.Distinct().Select(permissionId => new RolePermission
{
TenantId = tenantId,
RoleId = roleId,
PermissionId = permissionId
});
await dbContext.RolePermissions.AddRangeAsync(toAdd, cancellationToken);
await dbContext.SaveChangesAsync(cancellationToken);
await trx.CommitAsync(cancellationToken);
});
}
public Task SaveChangesAsync(CancellationToken cancellationToken = default)