Как я могу добавить пользователя.Значение идентификатора для пользовательского.Идентификатор пользователя во время регистрации?

#asp.net-core #entity-framework-core #asp.net-identity

#asp.net-core #entity-framework-core #asp.net-identity

Вопрос:

У меня будет предварительно заполненная база данных, в которую будет передана информация с другого сервера. Один из столбцов будет идентификатором пользователя и будет иметь отношение один к одному с ApplicationUser. Я использую Identity Core для обеспечения безопасности.

Как мне собрать AspNetUser.Введите идентификатор в процессе регистрации и переместите его в другую таблицу EmpProflie.Значение идентификатора пользователя?

Я думаю, что во время OnPostAsync if(result.Succeeded) я смогу получить значение идентификатора AspNetUser, вызвав следующий код где-нибудь после отправки подтверждения по электронной почте. Ошибка, очевидно, в var userId

 var aspUserId = _userManager.Users.Select(e=>e.Id);
var userId = _context.EmpProfile.Add(aspUserId).Entity.UserId;
  

Я не уверен, как передать это значение текущему пользователю, который регистрируется
так что это назначается с места в карьер. _context.EmpProfile.UserId?????

Вот полный Метод:

 public async Task<IActionResult> OnPostAsync(string returnUrl = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");
            ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();

            var isInDb =
                _context.EmpProfile.Any(e => e.Email.ToLower() == Input.Email.ToLower());

            if (ModelState.IsValid amp;amp; isInDb)
            {
                var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
                var result = await _userManager.CreateAsync(user, Input.Password);
                
                if (result.Succeeded)
                {
                    
                    _logger.LogInformation("User created a new account with password.");

                    var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
                    code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
                    var callbackUrl = Url.Page(
                        "/Account/ConfirmEmail",
                        pageHandler: null,
                        values: new { area = "Identity", userId = user.Id, code = code, returnUrl = returnUrl },
                        protocol: Request.Scheme);

                    await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                        $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

                    var userId = _userManager.Users.Select(e => e.Id);
                    var userId = _context.EmpProfile.Add(aspUserId).Entity.UserId; <--- ERROR

                    if (_userManager.Options.SignIn.RequireConfirmedAccount)
                    {
                        return RedirectToPage("RegisterConfirmation", new { email = Input.Email, returnUrl = returnUrl });
                    }
                    else
                    {
                        await _signInManager.SignInAsync(user, isPersistent: false);
                        return LocalRedirect(returnUrl);
                    }
                }


                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }

            // If we got this far, something failed, redisplay form
            return Page();
        }
  

Обновить

Я пробовал следующее, но я не уверен, как установить только значение идентификатора пользователя.

Как и пользователь @Fei Han, предложенный ниже, я нашел, как получить пользователя aspnet.Я просматривал stackoverflow прошлой ночью.

 var aspUserId = user.Id;
                    if (aspUserId != null)
                    {
                        var ownerId = new EmpInfo
                        {
                            UserId = aspUserId
                        };
                        _context.Update(ownerId);
                        _context.SaveChanges();
                    }
  

Однако это перезаписывает все мои существующие данные, когда я устанавливаю значение. Однако я правильно устанавливаю значение идентификатора пользователя. Я просто пока не могу понять, как установить / обновить только ОДНО свойство, не перезаписывая все остальные.

Комментарии:

1. how to only set/update the ONE property without overwriting all the others Привет @KentHub, пожалуйста, проверьте мое новое обновление.

Ответ №1:

Как мне собрать AspNetUser.Идентификатор во время процесса регистрации и перенесите его в другую таблицу EmpProflie.Значение идентификатора пользователя?

Если вы отладите код, вы обнаружите, что Id свойство инициализируется для формирования нового строкового значения GUID при создании нового объекта IdentityUser, как показано ниже.

введите описание изображения здесь

Таким образом, вы можете изменить приведенный ниже код, чтобы получить идентификатор нового пользователя, а затем сохранить или обновить таблицу EmpProfile.

 public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");
    ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
    if (ModelState.IsValid)
    {
        var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
        var result = await _userManager.CreateAsync(user, Input.Password);

        if (result.Succeeded)
        {
            //get new registered user's id
            var user_id = user.Id;

            //store or update with new reger user's id in EmpProfile table
            //...
  

Обновить:

как установить / обновить только ОДНО свойство без перезаписи всех остальных

Чтобы обновить идентификатор пользователя EmpProfile с помощью aspUserId и сохранить его в базе данных, вы можете обратиться к следующему фрагменту кода.

 var Emp = _context.EmpProfile.Where(e => e.Email.ToLower() == Input.Email.ToLower()).FirstOrDefault();

if (ModelState.IsValid amp;amp; Emp != null)
{
    var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
    var result = await _userManager.CreateAsync(user, Input.Password);

    if (result.Succeeded)
    {
        //get new registered user's id
        var aspUserId = user.Id;

        //store or update with new reger user's id in EmpProfile table
        //...

        if (aspUserId != null)
        {
            Emp.UserId = aspUserId;

            //By default, queries that return entity types are tracking
            //can make changes to those entity instances and have those changes persisted by SaveChanges()

            _context.SaveChanges();
        }
  

Комментарии:

1. Кроме того, вы можете проверить этот документ , чтобы узнать о «Отслеживании против Запросы без отслеживания «.

2. Спасибо, Фей, я пробовал что-то подобное, но что бы я ни делал (я думаю, выберите с помощью user PK), это не сработало. Я также столкнулся с ошибками разделения в моей текущей настройке, поэтому я стер свои навигационные отношения, и это работает так, как я надеялся. Еще раз спасибо за всю вашу помощь!