public async Task <MemberView> CreateNewUser(MemberView memberView, string baseUrl) { if (!EmailChecker.IsValidEmail(memberView.Email)) { throw new CoralTimeDangerException("Invalid email"); } var applicationUserNew = new ApplicationUser { UserName = memberView.UserName, Email = memberView.Email, IsManager = false, IsActive = true, IsAdmin = memberView.IsAdmin }; var roleUser = memberView.IsAdmin ? ApplicationRoleAdmin : ApplicationRoleUser; #region Check ApplicationUser, Roles, Member // Check ApplicationUser var isExistApplicationUser = await _userManager.FindByNameAsync(memberView.UserName); if (isExistApplicationUser != null) { throw new CoralTimeAlreadyExistsException($"User with userName {memberView.UserName} already exist"); } // Check ApplicationUser Roles var isExistRolesForMember = await _userManager.GetRolesAsync(applicationUserNew).ToAsyncEnumerable().Any(x => x.Contains(roleUser)); if (isExistRolesForMember) { throw new CoralTimeAlreadyExistsException($"User with userName {memberView.UserName} already exist '{roleUser}' role"); } // Check Member var isExistMember = Uow.MemberRepository.GetQueryByUserName(applicationUserNew.UserName); if (isExistMember != null) { throw new CoralTimeAlreadyExistsException($"Member with userName {memberView.UserName} already exist"); } #endregion // Insert ApplicationUser var userCreationResult = await _userManager.CreateAsync(applicationUserNew, memberView.Password); if (!userCreationResult.Succeeded) { CheckIdentityResultErrors(userCreationResult); } var applicationUser = await _userManager.FindByNameAsync(applicationUserNew.UserName); // Insert ApplicationUser Roles var userCreateRoleResult = await _userManager.AddToRoleAsync(applicationUser, roleUser); if (!userCreateRoleResult.Succeeded) { CheckIdentityResultErrors(userCreateRoleResult); } #region Set UserId to new Member. Save to Db. Get Member from Db with related entity User by UserId. // 1. Convert MemberView to Member. var newMember = memberView.GetModel(Mapper); // 2. Assign UserId to Member (After Save, when you try to get entity from Db, before assign UserId to entity then it has Related Entity User). newMember.UserId = applicationUser.Id; // 3. Save in Db. Uow.MemberRepository.Insert(newMember); Uow.Save(); // 4. Clear cache for Members. Uow.MemberRepository.LinkedCacheClear(); // 5. Get From Db -> Cache New Member. (Get entity With new created related entity - User) var memberByName = Uow.MemberRepository.LinkedCacheGetByName(memberView.UserName); #endregion // Identity #3. Create claims. Add Claims for user in AspNetUserClaims. var claimsUser = ClaimsCreator.CreateUserClaims(applicationUser.UserName, memberView.FullName, memberView.Email, roleUser, memberByName.Id); var claimsUserResult = await _userManager.AddClaimsAsync(applicationUser, claimsUser); if (!claimsUserResult.Succeeded) { CheckIdentityResultErrors(userCreateRoleResult); } var urlIcon = _avatarService.GetUrlIcon(memberByName.Id); var memberViewResult = memberByName.GetView(Mapper, urlIcon); if (memberView.SendInvitationEmail) { await SentInvitationEmailAsync(memberView, baseUrl); } return(memberViewResult); }