From 31da8a4402fca0654e17c7195da95bc2d7c2754a Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 29 Sep 2025 10:18:44 +0530 Subject: [PATCH] Added the AsNoTracking in GetCurrentEmployeeAsync and get permission Ids helper functions --- Marco.Pms.Services/Helpers/RolesHelper.cs | 7 ++++++- Marco.Pms.Services/Helpers/UserHelper.cs | 4 ++-- Marco.Pms.Services/Service/PermissionServices.cs | 6 ++++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Marco.Pms.Services/Helpers/RolesHelper.cs b/Marco.Pms.Services/Helpers/RolesHelper.cs index c9f40f1..a963482 100644 --- a/Marco.Pms.Services/Helpers/RolesHelper.cs +++ b/Marco.Pms.Services/Helpers/RolesHelper.cs @@ -37,6 +37,7 @@ namespace MarcoBMS.Services.Helpers // --- Step 1: Define the subquery using the main thread's context --- // This is safe because the query is not executed yet. var employeeRoleIdsQuery = _context.EmployeeRoleMappings + .AsNoTracking() .Where(erm => erm.EmployeeId == EmployeeId && erm.IsEnabled) .Select(erm => erm.RoleId); @@ -50,6 +51,7 @@ namespace MarcoBMS.Services.Helpers // Now, re-create and execute the query using this new, isolated context. var roleIds = await contextForCache.EmployeeRoleMappings + .AsNoTracking() .Where(erm => erm.EmployeeId == EmployeeId && erm.IsEnabled) .Select(erm => erm.RoleId) .ToListAsync(); @@ -73,9 +75,12 @@ namespace MarcoBMS.Services.Helpers var roleIds = await employeeRoleIdsQuery.ToListAsync(); var permissionIds = await _context.RolePermissionMappings + .AsNoTracking() .Where(rp => roleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).ToListAsync(); - var permissions = await _context.FeaturePermissions.Include(f => f.Feature) + var permissions = await _context.FeaturePermissions + .AsNoTracking() + .Include(f => f.Feature) .Where(fp => permissionIds.Contains(fp.Id)) .Distinct() .ToListAsync(); diff --git a/Marco.Pms.Services/Helpers/UserHelper.cs b/Marco.Pms.Services/Helpers/UserHelper.cs index 49d3fb7..f5d4fc3 100644 --- a/Marco.Pms.Services/Helpers/UserHelper.cs +++ b/Marco.Pms.Services/Helpers/UserHelper.cs @@ -36,7 +36,7 @@ namespace MarcoBMS.Services.Helpers var tenantId = _httpContextAccessor.HttpContext?.User.FindFirst("TenantId")?.Value; if (tenantId != null) { - return await _context.Tenants.FirstOrDefaultAsync(t => t.Id == Guid.Parse(tenantId)); + return await _context.Tenants.AsNoTracking().FirstOrDefaultAsync(t => t.Id == Guid.Parse(tenantId)); } return null; } @@ -54,7 +54,7 @@ namespace MarcoBMS.Services.Helpers { var user = await GetCurrentUserAsync(); if (user == null) return new Employee { }; - var Employee = await _context.Employees.Include(e => e.JobRole).FirstOrDefaultAsync(e => e.ApplicationUserId == user.Id && e.IsActive); + var Employee = await _context.Employees.AsNoTracking().Include(e => e.JobRole).FirstOrDefaultAsync(e => e.ApplicationUserId == user.Id && e.IsActive); return Employee ?? new Employee { }; } diff --git a/Marco.Pms.Services/Service/PermissionServices.cs b/Marco.Pms.Services/Service/PermissionServices.cs index 79c3cd6..e7ca947 100644 --- a/Marco.Pms.Services/Service/PermissionServices.cs +++ b/Marco.Pms.Services/Service/PermissionServices.cs @@ -79,6 +79,7 @@ namespace Marco.Pms.Services.Service { // Fetch permissions explicitly assigned to this employee in the project. var projectLevelPermissionIds = await _context.ProjectLevelPermissionMappings + .AsNoTracking() .Where(pl => pl.ProjectId == projectId.Value && pl.EmployeeId == employeeId) .Select(pl => pl.PermissionId) .ToListAsync(); @@ -97,6 +98,7 @@ namespace Marco.Pms.Services.Service // Get all feature permissions under those modules where the user didn't have explicit project-level grants. var allOverriddenPermissions = await _context.FeaturePermissions + .AsNoTracking() .Where(fp => projectLevelModuleIds.Contains(fp.FeatureId) && !projectLevelPermissionIds.Contains(fp.Id)) .Select(fp => fp.Id) @@ -138,12 +140,12 @@ namespace Marco.Pms.Services.Service var hasPermission = await HasPermission(PermissionsMaster.ManageProject, employeeId); if (hasPermission) { - var projects = await _context.Projects.Where(c => c.TenantId == LoggedInEmployee.TenantId).ToListAsync(); + var projects = await _context.Projects.AsNoTracking().Where(c => c.TenantId == LoggedInEmployee.TenantId).ToListAsync(); projectIds = projects.Select(p => p.Id).ToList(); } else { - var allocation = await _context.ProjectAllocations.Where(c => c.EmployeeId == employeeId && c.IsActive).ToListAsync(); + var allocation = await _context.ProjectAllocations.AsNoTracking().Where(c => c.EmployeeId == employeeId && c.IsActive).ToListAsync(); if (!allocation.Any()) { return false;