Запись идентификатора .NET Core 2.2 в дополнительную таблицу при CreateAsync()

#c# #.net #asp.net-identity

#c# #.net #asp.net-identity #asp.net-идентификатор

Вопрос:

Я добавил дополнительную таблицу к схеме идентификации по умолчанию под названием UserProfile , которая содержит такие вещи, как информация об адресе. Когда новый пользователь регистрируется на сайте, я хотел бы добавить пользователей в IdentityUser таблицу по умолчанию, добавить роли пользователей в UserRoles таблицу по умолчанию и добавить дополнительную информацию о пользователе в мою новую UserProfile таблицу. В настоящее время у меня это настроено, как показано в псевдокоде ниже. В insert User и UserRoles используются методы identitity по умолчанию, и я написал свои собственные методы для UserProfile insert. В основном это происходит с тремя разными транзакциями вставки. Если происходит сбой в любой из трех транзакций вставки, затем выполняются отдельные Delete() транзакции. Хотя у меня это работает, я предполагаю, что есть более элегантный способ сделать это?

  CreateUser()

 if CreateUser == success
 {
    AddUserRoles()

    if AddRoles == success
    {
        AddUserProfile()

        if AddUserProfile != success
        {
            DeleteUserRoles()
            DeleteUser()
        }
    }
    else
    {
        DeleteUser()
    }
 }
  

ФАКТИЧЕСКИЙ КОД

 public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    ReturnUrl = returnUrl;

    if (ModelState.IsValid)
    {
        var user = new ApplicationUser { UserName = Input.Email, Email = Input.Email };
        var userResult = await _userManager.CreateAsync(user, Input.Password);

        if (userResult.Succeeded)
        {
            var currentUser = await _userManager.FindByNameAsync(user.UserName);
            var roleResult = await _userManager.AddToRolesAsync(currentUser, roles);

            if (roleResult.Succeeded)
            {
                var profileSuccess = _userRepo.AddUserProfile(currentUser.Id);

                if (profileSuccess)
                {
                    return RedirectToPage("./RegisterConfirmation", new { email = user.Email });
                }
                else
                {
                    await _userManager.DeleteAsync(user);
                    await _userManager.RemoveFromRolesAsync(user, roles);
                }
            } 
            else 
            {
                await _userManager.DeleteAsync(user);
            }  
        }
    }

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

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

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

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

2. Я добавил код