public async Task<ActionResult> Create(CreateUserViewModel model)
 {
     bool haserror = false;
     if (ModelState.IsValid)
     {
         var user = new ApplicationUser { UserName = model.Username };
         var res = await UserManager.CreateAsync(user, model.Password);
         if (res.Succeeded)
         {
             res = null;
             if (model.IsAdministrator)
             {
                 res = await UserManager.AddToRoleAsync(user.Id, "admin");
                 if (res.Succeeded)
                 {
                     if (model.EmployeeId != "0")
                     {
                         await _empService.AssignUser(model.EmployeeId.ToInt(), user);
                     }
                     return RedirectToAction("Index");
                 }
                 else
                 {
                     ModelState.AddModelError(String.Empty, $"Der Benutzer {user.UserName} konnte nicht der Rolle admin zugeordnet werden. Bitte kontaktieren Sie den Administrator!");
                     res = null;
                     res = await UserManager.DeleteAsync(user);
                     //if (!res.Succeeded) Logger.LogError($"Couldn't roleback the user {user.UserName}! ({getErrors(res)}");
                     haserror = true;
                 }
             }
             if (!haserror)
             {
                 if (model.EmployeeId != "0")
                 {
                     await _empService.AssignUser(model.EmployeeId.ToInt(), user);
                 }
                 return RedirectToAction("Index");
             }
         }
         else
         {
             AddErrors(res);
         }
     }
     model.Password = string.Empty;
     model.ConfirmPassword = string.Empty;
     var emps = await _empService.GetEmployees(true, true);
     var list = emps.Select(e => new SelectListItem { Value = e.Id.ToString(), Text = $"{e.FirstName} {e.LastName}" }).ToList();
     ViewBag.Employees = new SelectList(list, "Value", "Text");
     return View(model);
 }
        /// <summary>
        /// Get Employee by User
        /// </summary>
        /// <param name="user">Application User</param>
        /// <returns></returns>
        public async Task<EmployeeModel> GetEmployee(ApplicationUser user)
        {
            var emps = await _context.Employees.ToListAsync();
            EmployeeModel emp = null;
            foreach (var e in emps)
            {
                if (e.User != null)
                {
                    if (e.User.Id == user.Id)
                    {
                        emp = e;
                        break;
                    }
                }
            }

            //emp = await _context.Employees.Where(e => (e.User == null) ? false : e.User.Id == user.Id).FirstOrDefaultAsync();
            return emp;
        }
        public async Task ChangeAssignedEmployee(ApplicationUser user, EmployeeModel newEmployee)
        {
            //Den Link entfernen
            await UnassignUser(user);
            await AssignUser(newEmployee, user);

            //var emp = await _context.Employees.Where(e => e.User.Id == user.Id).FirstOrDefaultAsync();
            //var newUser = await _context.Users.Where(u => u.Id == user.Id).FirstOrDefaultAsync();
            //if (emp != null)
            //{
            //    //Link besteht, Employee ändern
            //    emp.User = newUser;
            //    _context.Entry(emp).State = EntityState.Modified;
            //    await _context.SaveChangesAsync();
            //}
            //else
            //{
            //    //Link gibt es nicht
            //    newEmployee.User = newUser;
            //    _context.Entry(newEmployee).State = EntityState.Modified;
            //    await _context.SaveChangesAsync();
            //}
        }
 public async Task ChangeAssignedEmployee(ApplicationUser user, int newEmployeeId)
 {
     var emp = await GetEmployee(newEmployeeId);
     await ChangeAssignedEmployee(user, emp);
 }
        public async Task UnassignUser(ApplicationUser user)
        {
            try
            {
                //var link = await _context.EmployeeUsers.Where(e => e.UserId == user.Id).FirstOrDefaultAsync();
                //if (link != null)
                //{
                //    //link.UserId = String.Empty;
                //    //_context.Entry(link).State = EntityState.Modified;
                //    _context.EmployeeUsers.Remove(link);
                //    await _context.SaveChangesAsync();
                //}
                //using (var db = new ApplicationDbContext())
                //{
                //    var emp = await db.Employees.Where(e => e.User.Id == user.Id).FirstOrDefaultAsync();
                //    emp.User = null;
                //    db.Entry(emp).State = EntityState.Modified;
                //    await db.SaveChangesAsync();
                //}

                var emp = await _context.Employees.Where(e => e.User.Id == user.Id).FirstOrDefaultAsync();
                if (emp != null)
                {
                    emp.User = null;
                    _context.Entry(emp).State = EntityState.Modified;
                    await _context.SaveChangesAsync();
                }

            }
            catch (DbUpdateException ex)
            {
                throw new Exception("Cannot remove user from Employee!", ex);
            }
        }
 public async Task AssignUser(EmployeeModel emp, ApplicationUser user)
 {
     ////var link = new EmployeeUser { EmployeeId = emp.EmployeeId, UserId = user.Id };
     ////_context.EmployeeUsers.Add(link);
     ////await _context.SaveChangesAsync();
     //using (var db = new ApplicationDbContext())
     //{
     //    //var currEmp = await db.Employees.Where(e => e.Id == emp.Id).FirstOrDefaultAsync();
     //    //currEmp.User = user;
     //    //db.Entry(currEmp).State = EntityState.Modified;
     //    emp.User = user;
     //    db.Entry(emp).State = EntityState.Modified;
     //    await db.SaveChangesAsync();
     //}
     //Zuerst den User ermitteln
     var u = await _context.Users.Where(x => x.Id == user.Id).FirstOrDefaultAsync();
     emp.User = u;
     _context.Entry(emp).State = EntityState.Modified;
     try
     {
         await _context.SaveChangesAsync();
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
 public async Task AssignUser(int EmployeeId, ApplicationUser user)
 {
     var emp = await GetEmployee(EmployeeId);
     await AssignUser(emp, user);
 }
 //private async Task<IdentityRole> getRoleFromUser(string userId)
 //{
 //    var roleIds = await getRoleIdFromUser(userId);
 //    return await Context.Roles.Where(r => roleIds.Contains(r.Id)).ToListAsync();
 //}
 private string getRoleIdFromUser(ApplicationUser user)
 {
     var role = user.Roles.FirstOrDefault();
     if (role == null) return string.Empty;
     return role.RoleId;
 }
 private async Task<IdentityRole> getRoleFromUser(ApplicationUser user)
 {
     var id = getRoleIdFromUser(user);
     return await getRole(id);
 }