Запись .NET Core 2.2 Identity в дополнительную таблицу на CreateAsync () - PullRequest
0 голосов
/ 21 марта 2019

Я добавил дополнительную таблицу в схему идентификации по умолчанию UserProfile, которая содержит такие вещи, как информация об адресе. Когда новый пользователь регистрируется на сайте, я хотел бы добавить пользователей в таблицу IdentityUser по умолчанию, добавить роли пользователей в таблица по умолчанию UserRoles, и добавьте дополнительную информацию о пользователе в мою новую таблицу UserProfile. У меня есть это в настоящее время настройки, как показано в псевдокоде ниже. При вставке User и UserRoles используются методы идентификации по умолчанию, и я написал свои собственные методы для вставки UserProfile. В основном это происходит с тремя различными транзакциями вставки. Если в одной из трех транзакций вставки произошел сбой, она выполняет отдельные транзакции 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();
}
...