fix: use raw sql delete+insert with execution strategy for role template permissions

This commit is contained in:
2025-12-06 14:40:49 +08:00
parent ab4e407f9c
commit 7ed133509e

View File

@@ -104,22 +104,20 @@ public sealed class EfRoleTemplateRepository(IdentityDbContext dbContext) : IRol
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToArray();
// 3. 清空旧权限
var existing = await dbContext.RoleTemplatePermissions
.Where(x => x.RoleTemplateId == template.Id)
.ToListAsync(cancellationToken);
dbContext.RoleTemplatePermissions.RemoveRange(existing);
await dbContext.SaveChangesAsync(cancellationToken);
// 3. 清空旧权限(原生 SQL 避免跟踪干扰)
await dbContext.Database.ExecuteSqlRawAsync(
"DELETE FROM \"role_template_permissions\" WHERE \"RoleTemplateId\" = {0};",
parameters: new object[] { template.Id },
cancellationToken: cancellationToken);
// 4. 插入新权限
var toAdd = normalized.Select(code => new RoleTemplatePermission
// 4. 插入新权限ON CONFLICT DO NOTHING 防御重复)
foreach (var code in normalized)
{
RoleTemplateId = template.Id,
PermissionCode = code
});
await dbContext.RoleTemplatePermissions.AddRangeAsync(toAdd, cancellationToken);
await dbContext.SaveChangesAsync(cancellationToken);
await dbContext.Database.ExecuteSqlRawAsync(
"INSERT INTO \"role_template_permissions\" (\"RoleTemplateId\",\"PermissionCode\",\"CreatedAt\",\"CreatedBy\",\"UpdatedAt\",\"UpdatedBy\",\"DeletedAt\",\"DeletedBy\") VALUES ({0},{1},NOW(),NULL,NULL,NULL,NULL,NULL) ON CONFLICT DO NOTHING;",
parameters: new object[] { template.Id, code },
cancellationToken: cancellationToken);
}
await trx.CommitAsync(cancellationToken);
});