public override async Task <IAppAccess> UpdateAsync(IAppAccess entity)
        {
            entity.CheckArgument(nameof(entity));
            entity.Identity.CheckArgument(nameof(entity.Identity));
            entity.Roles.CheckArgument(nameof(entity.Roles));

            //Delete all costs that are no longer included in the list.
            var identXRoles = identityXroleController.ExecuteQuery(e => e.IdentityId == entity.Identity.Id).ToList();

            foreach (var item in identXRoles)
            {
                var tmpItem = entity.Roles.SingleOrDefault(i => i.Id == item.RoleId);

                if (tmpItem == null)
                {
                    await identityXroleController.DeleteAsync(item.Id).ConfigureAwait(false);
                }
            }

            var result   = new AppAccess();
            var identity = await identityController.UpdateAsync(entity.Identity).ConfigureAwait(false);

            foreach (var item in entity.Roles)
            {
                var role     = new Role();
                var joinRole = new IdentityXRole();

                role.Id             = item.Id;
                joinRole.IdentityId = identity.Id;
                if (item.Id == 0)
                {
                    item.Designation = RoleController.ClearRoleDesignation(role.Designation);
                    var qryItem = roleController.ExecuteQuery(e => e.Designation.Equals(item.Designation))
                                  .FirstOrDefault();

                    if (qryItem != null)
                    {
                        role.CopyProperties(qryItem);
                        joinRole.RoleId = role.Id;
                    }
                    else
                    {
                        role.CopyProperties(item);
                        await roleController.InsertAsync(role).ConfigureAwait(false);

                        joinRole.Role = role;
                    }
                }
                else
                {
                    var qryItem = await roleController.GetByIdAsync(role.Id).ConfigureAwait(false);

                    if (qryItem != null)
                    {
                        role.CopyProperties(qryItem);
                        joinRole.RoleId = role.Id;
                    }
                }
                var tmpItem = identXRoles.SingleOrDefault(e => e.IdentityId == joinRole.IdentityId && e.RoleId == joinRole.RoleId);

                if (tmpItem == null)
                {
                    await identityXroleController.InsertAsync(joinRole).ConfigureAwait(false);
                }
                result.RoleEntities.Add(role);
            }
            return(result);
        }