/// <summary>
        /// Adds the users to roles.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="seedingType">Type of the seeding.</param>
        private static void AddUsersToRoles(AuthenticationDbContext context,
                                            SeedingType seedingType)
        {
            List <IdentityUserRole <String> > identityUserRoles = IdentityUserRoleSeedData.GetIdentityUserRoles(seedingType);

            foreach (IdentityUserRole <String> identityUserRole in identityUserRoles)
            {
                Boolean foundUserRole = context.UserRoles.Any(a => a.RoleId == identityUserRole.RoleId && a.UserId == identityUserRole.UserId);

                if (!foundUserRole)
                {
                    context.UserRoles.Add(identityUserRole);
                }
            }
        }
        /// <summary>
        /// Adds the users.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="seedingType">Type of the seeding.</param>
        private static void AddUsers(AuthenticationDbContext context,
                                     SeedingType seedingType)
        {
            List <IdentityUser> identityUsers = IdentityUserSeedData.GetIdentityUsers(seedingType);

            foreach (IdentityUser identityUser in identityUsers)
            {
                Boolean foundUser = context.Users.Any(a => a.UserName == identityUser.UserName);

                if (!foundUser)
                {
                    context.Users.Add(identityUser);
                }
            }
        }
        /// <summary>
        /// Adds the roles.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="seedingType">Type of the seeding.</param>
        private static void AddRoles(AuthenticationDbContext context,
                                     SeedingType seedingType)
        {
            List <IdentityRole> roles = RoleSeedData.GetIdentityRoles(seedingType);

            foreach (IdentityRole role in roles)
            {
                Boolean foundRole = context.Roles.Any(a => a.Name == role.Name);

                if (!foundRole)
                {
                    context.Roles.Add(role);
                }
            }
        }
        /// <summary>
        /// Initialises the authentication database.
        /// </summary>
        /// <param name="authenticationDbContext">The authentication database context.</param>
        /// <param name="seedingType">Type of the seeding.</param>
        public static void InitialiseAuthenticationDatabase(AuthenticationDbContext authenticationDbContext,
                                                            SeedingType seedingType)
        {
            Boolean isDbInitialised = false;
            Int32   retryCounter    = 0;

            while (retryCounter < 20 && !isDbInitialised)
            {
                try
                {
                    if (authenticationDbContext.Database.IsSqlServer())
                    {
                        authenticationDbContext.Database.Migrate();
                    }

                    DatabaseSeeding.AddRoles(authenticationDbContext, seedingType);
                    DatabaseSeeding.AddUsers(authenticationDbContext, seedingType);
                    DatabaseSeeding.AddUsersToRoles(authenticationDbContext, seedingType);

                    authenticationDbContext.SaveChanges();

                    isDbInitialised = true;
                    break;
                }
                catch (Exception ex)
                {
                    retryCounter++;
                    Thread.Sleep(10000);
                }
            }

            if (!isDbInitialised)
            {
                String connString = authenticationDbContext.Database.GetDbConnection().ConnectionString;

                Exception newException = new Exception($"Error initialising Db with Connection String [{connString}]");
                throw newException;
            }
        }