From 7ed133509e7c64487200ca7aaba182710ce13c9b Mon Sep 17 00:00:00 2001 From: MSuMshk <2039814060@qq.com> Date: Sat, 6 Dec 2025 14:40:49 +0800 Subject: [PATCH] fix: use raw sql delete+insert with execution strategy for role template permissions --- .../Persistence/EfRoleTemplateRepository.cs | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/Infrastructure/TakeoutSaaS.Infrastructure/Identity/Persistence/EfRoleTemplateRepository.cs b/src/Infrastructure/TakeoutSaaS.Infrastructure/Identity/Persistence/EfRoleTemplateRepository.cs index 309acec..625c0df 100644 --- a/src/Infrastructure/TakeoutSaaS.Infrastructure/Identity/Persistence/EfRoleTemplateRepository.cs +++ b/src/Infrastructure/TakeoutSaaS.Infrastructure/Identity/Persistence/EfRoleTemplateRepository.cs @@ -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); });