public async Task <ActionResult> Edit(EditUserViewModel editUser, params string[] selectedRole) { if (ModelState.IsValid) { var user = await UserManager.FindByIdAsync(editUser.Id); if (user == null) { return(HttpNotFound()); } user.Id = editUser.Id; //user.UserName = editUser.UserName; // if email is NOT exact, this will cause new user. user.Email = editUser.Email; user.FirstName = editUser.FirstName; user.LastName = editUser.LastName; user.IsClient = editUser.IsClient; user.ClientID = editUser.ClientID; user.Active = editUser.Active; // Update User Information await UserManager.UpdateAsync(user); // Client / Roles var client = db.Clients.FirstOrDefaultAsync(x => x.ClientID == editUser.ClientID); if (client != null) { selectedRole = selectedRole ?? new string[] { }; var existRoles = await UserManager.GetRolesAsync(user.Id); // add new roles var result = await UserManager.AddToRolesAsync(user.Id, selectedRole.Except(existRoles).ToArray()); // remove deleted roles if (result.Succeeded) { result = await UserManager.RemoveFromRolesAsync(user.Id, existRoles.Where(ur => !selectedRole.Contains(ur)).ToArray()); } if (!result.Succeeded) { ModelState.AddModelError("", result.Errors.First()); return(View()); } } // Applications { editUser.SelectedApplications = editUser.SelectedApplications ?? new int[] { }; List <UserApplication> existUserApplications = db.UserApplications.Where(ua => ua.UserID == editUser.Id).ToList(); var userApplicationsToDelete = existUserApplications.Where(ua => !editUser.SelectedApplications.Contains(ua.ApplicationID)); var userApplicationIdToAdd = editUser.SelectedApplications.Except(existUserApplications.Select(ua => ua.ApplicationID)); db.UserApplications.RemoveRange(userApplicationsToDelete); db.UserApplications.AddRange(userApplicationIdToAdd.Select(uaid => new UserApplication { ApplicationID = uaid, UserID = editUser.Id })); } await db.SaveChangesAsync(); return(RedirectToAction("Index")); } ModelState.AddModelError("", "Something failed."); return(View()); }