我向名为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();
}