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?