public async Task <bool> Initialize()
        {
            bool isChanged = Database.EnsureCreated();

            var newRoles = AppUser.Role.Names.Where(n => !Roles.Where(r => string.Equals(n, r.Name)).Any()).Select(n => new IdentityRole(n)).ToList();

            if (newRoles.Any())
            {
                await Roles.AddRangeAsync(newRoles);

                isChanged = true;
            }

            if (!Users.Any())
            {
                if (!await CreateUser(AppUser.DefaultAdminUserName, AppUser.DefaultAdminUserPassword, "", true))
                {
                    return(false);
                }

                var adminUser = await Users.Where(u => u.UserName == AppUser.DefaultAdminUserName).FirstOrDefaultAsync();

                var adminRole = await Roles.Where(r => r.Name == AppUser.Role.Admin).FirstOrDefaultAsync();

                await UserRoles.AddAsync(new IdentityUserRole <string>
                {
                    UserId = adminUser.Id,
                    RoleId = adminRole.Id,
                });

                isChanged = true;
            }

            if (!System.Any())
            {
                await System.AddAsync(new DBConfig.System
                {
                    Email = new DBConfig.System.EmailServer()
                });

                isChanged = true;
            }

            if (isChanged)
            {
                await SaveChangesAsync();
            }

            AppUser.Role.IdNameMap = await Roles.Where(r => AppUser.Role.Names.Contains(r.Name)).ToDictionaryAsync(r => r.Id, r => r.Name);

            AppUser.Role.NameIdMap = AppUser.Role.IdNameMap.ToDictionary(p => p.Value, p => p.Key);

            return(true);
        }