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) .Distinct(StringComparer.OrdinalIgnoreCase)
.ToArray(); .ToArray();
// 3. 清空旧权限 // 3. 清空旧权限(原生 SQL 避免跟踪干扰)
var existing = await dbContext.RoleTemplatePermissions await dbContext.Database.ExecuteSqlRawAsync(
.Where(x => x.RoleTemplateId == template.Id) "DELETE FROM \"role_template_permissions\" WHERE \"RoleTemplateId\" = {0};",
.ToListAsync(cancellationToken); parameters: new object[] { template.Id },
dbContext.RoleTemplatePermissions.RemoveRange(existing); cancellationToken: cancellationToken);
await dbContext.SaveChangesAsync(cancellationToken);
// 4. 插入新权限 // 4. 插入新权限ON CONFLICT DO NOTHING 防御重复)
var toAdd = normalized.Select(code => new RoleTemplatePermission foreach (var code in normalized)
{ {
RoleTemplateId = template.Id, await dbContext.Database.ExecuteSqlRawAsync(
PermissionCode = code "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 dbContext.RoleTemplatePermissions.AddRangeAsync(toAdd, cancellationToken); }
await dbContext.SaveChangesAsync(cancellationToken);
await trx.CommitAsync(cancellationToken); await trx.CommitAsync(cancellationToken);
}); });