0

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:

  1. creating asp.net identity user
  2. 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?

Yuri Cardoso
  • 113
  • 1
  • 13
Oleg Sh
  • 8,496
  • 17
  • 89
  • 159

0 Answers0