public async Task <JsonResult> JoinUserInfos([FromBody] int[] data)
        {
            using var db = AppContextFactory.DB;
            using var t  = db.Database.BeginTransaction();

            try
            {
                var user_1 = db.UserInfos.First(i => i.Id == data[0]);
                var user_2 = db.UserInfos.First(i => i.Id == data[1]);

                // Есть ли на втором пользователе проекты? Привязан ли он ко второму пользователю?
                var vacancies_2 = db.Vacancies.Where(i => i.UserInfoId == user_2.Id).ToList();

                if (vacancies_2.Count > 0)
                {
                    foreach (var v in vacancies_2)
                    {
                        v.UserInfoId = user_1.Id;
                        await db.SaveChangesAsync();
                    }
                }

                // Есть ли привязка к пользователю в системе?
                if (!string.IsNullOrEmpty(user_2.UserId))
                {
                    // Если уже есть привязка к пользователю, то перевешиваем.
                    user_1.UserId ??= user_2.UserId;
                    await db.SaveChangesAsync();
                }

                // Если есть закрепленные навыки и предметные области.
                var competences_2 = db.UserCompetences.Where(i => i.UserInfoId == user_2.Id).ToList();
                var competences_1 = db.UserCompetences.Where(i => i.UserInfoId == user_1.Id).ToList();

                if (competences_2.Count > 0)
                {
                    foreach (var c in competences_2)
                    {
                        if (competences_1.Any(i => i.CompetenceId == c.Id))
                        {
                            continue;
                        }
                        else
                        {
                            c.UserInfoId = user_1.Id;
                            await db.SaveChangesAsync();
                        }
                    }
                }

                // Обновляем все DocFiles, чтобы повторно не плодить исполнителеи.
                var docFiles_2 = db.DocFiles.Where(i => i.UserInfoId == user_2.Id).ToList();

                foreach (var file in docFiles_2)
                {
                    file.UserInfoId = user_1.Id;
                    await db.SaveChangesAsync();
                }

                // И, напоследок, удаляем или перемещаем аватарку пользователя.
                if (!string.IsNullOrEmpty(user_2.AvatarPath))
                {
                    if (string.IsNullOrEmpty(user_1.AvatarPath))
                    {
                        user_1.AvatarPath = user_2.AvatarPath;
                        await db.SaveChangesAsync();
                    }
                    else
                    {
                        AvatarHelper.DeleteFile(_env, user_2.AvatarPath);
                    }
                }

                db.UserInfos.Remove(user_2);
                await db.SaveChangesAsync();

                await t.CommitAsync();
            }
            catch (Exception ex)
            {
                await t.RollbackAsync();

                return(Json(new { error = true, message = "Нельзя сотворить здесь!" }));
            }

            return(Json(new { error = false, message = "Исследование завершено!" }));
        }
        public async Task <IActionResult> Edit(int?id, string name)
        {
            UserEditViewModel model = new UserEditViewModel();

            await TryUpdateModelAsync(model, "", i => i.FIO, i => i.CareerStart, i => i.VacationStart, i => i.Avatar, i => i.AvatarPath, i => i.ApplicationUserId);

            // Валидация.
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            using var db = AppContextFactory.DB;
            using var t  = db.Database.BeginTransaction();

            try
            {
                // Редактируем пользователя.
                var user = db.UserInfos.FirstOrDefault(i => i.Id == id) ?? new UserInfo();

                // Аватара Фрейи (да был такой НИП в WOTLK, вернуться бы в 10 класс...).
                // Новый аватар.
                if (model.Avatar != null)
                {
                    // Удаление старого файла, если он у нас есть.
                    if (!string.IsNullOrEmpty(model.AvatarPath))
                    {
                        AvatarHelper.DeleteFile(_env, model.AvatarPath);
                    }

                    // Сохранение нового файла.
                    string filePath = await AvatarHelper.SaveFile(model.Avatar, _env);

                    // Прикрепляем / обновляем файл к профилю пользователя.
                    user.AvatarPath = filePath;
                }

                // Обновляем данные пользователя.
                user.CareerStart   = model.CareerStart;
                user.Name          = model.FIO;
                user.VacationStart = model.VacationStart;
                user.UserId        = model.ApplicationUserId;

                if (user.Id == 0)
                {
                    db.Entry(user).State = EntityState.Added;
                }

                await db.SaveChangesAsync();

                await t.CommitAsync();
            }
            catch (Exception ex)
            {
                await t.RollbackAsync();

                ModelState.AddModelError("Error", "В процессе сохранения произошла ошибка! Ошибка: " + ex.Message);
            }

            return(RedirectToAction("Index"));
        }