Я добавил дополнительную таблицу в схему идентификации по умолчанию 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();
}