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)
|
.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);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user