The procedure does not work properly Entity Framework ASP.NET MVC 5 C#5

98 views Asked by At

I have been facing this problem with assigning users to a proper role. The code looks just fine, but in reality half of the users gets a proper role, the other half stays without a role at all. Here is the method which does it:

 public IdentityResult RefreshUserGroupRoles(long? userId)
 {
     if (userId == null) throw new ArgumentNullException(nameof(userId));
     var user = _userManager.FindById(userId.Value);
     if(user == null)
     {
         throw new ArgumentNullException(nameof(userId));
     }
     // Remove user from previous roles:
     var oldUserRoles = _userManager.GetRoles(userId.Value);
     if (oldUserRoles.Count > 0)
     {
         _userManager.RemoveFromRoles(userId.Value, oldUserRoles.ToArray());
     }
     // Find the roles this user is entitled to from group membership:
     var newGroupRoles = this.GetUserGroupRoles(userId.Value);
     // Get the damn role names:
     var allRoles = _roleManager.Roles.ToList();
     var addTheseRoles = allRoles.Where(r => newGroupRoles.Any(gr => gr.AppRoleId == r.Id));
     var roleNames = addTheseRoles.Select(n => n.Name).ToArray();
     //_db.Database.CurrentTransaction.Commit();
     // Add the user to the proper roles
     var transaction = _db.Database.BeginTransaction();
     IdentityResult result;
     try
     {
         result = _userManager.AddToRoles(userId.Value, roleNames);
         transaction.Commit();
         _db.DbContextTransactionAu.Commit(); //This is for Audit
     }
     catch (Exception)
     {
         transaction.Rollback();
         throw;
     }
     _db.DbContextTransactionAuDispose?.Dispose();
     return result;
}

      public IEnumerable<AppGroupRole> GetUserGroupRoles(long userId)
    {
        var userGroups = this.GetUserGroups(userId).ToList();
        if (userGroups.Count == 0) return new Collection<AppGroupRole>().AsEnumerable();
        var userGroupRoles = new List<AppGroupRole>();
        foreach(var group in userGroups)
        {
            userGroupRoles.AddRange(group.AppRoles.ToArray());
        }
        return userGroupRoles;
    }

Any idea what could be wrong?

0

There are 0 answers