I have the following structure:
There are several roles (types of users). One of type (named Driver) should have a child table, other - not.
My Application user code:
public class ApplicationUser : IdentityUser { public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) { // bla-bla-bla return userIdentity; } public int? CompanyId { get; set; } public string SMSnumber { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
When I create new user with role driver I have to do the following (not real code, just for example in one place):
var user = new ApplicationUser { UserName = model.AspNetUserName, CompanyId = companyId, FirstName = model.FirstName, LastName = model.LastName }; var result = await UserManager.CreateAsync(user, model.Password); if (result.Succeeded) { var roleResult = await UserManager.AddToRoleAsync(user.Id, RoleStaticStrings.ROLE_DRIVER); if (roleResult.Succeeded) { var driver = mapper.Map<DriverPersonalInfoVM, Driver>(model, new Driver { CompanyId = companyId, UserId = user.Id, RecordDate = DateTime.UtcNow, Active = true }); db.Drivers.Add(driver); try { db.SaveChanges(); } catch (Exception ex) { await UserManager.DeleteAsync(user); } } }
so, I have to separate a request for creating user for 2 requests:
- creating asp.net identity user
- creating Driver record
I think, everybody understands disadvantages - 2 requests instead on one, not in the same transaction...
How to "include" it to ApplicationUser and don't make it mandatory?