fix: use raw sql delete+insert with execution strategy for role template permissions
This commit is contained in:
@@ -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);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user