protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);

            Event.ConfigureForDatabase(builder);
            Region.ConfigureForDatabase(builder);
            LocationGroup.ConfigureForDatabase(builder);
            Location.ConfigureForDatabase(builder);

            BagCategory.ConfigureForDatabase(builder);
            Item.ConfigureForDatabase(builder);
            PlacedItem.ConfigureForDatabase(builder);
            Currency.ConfigureForDatabase(builder);
            CurrencyAmount.ConfigureForDatabase(builder);

            ElementalType.ConfigureForDatabase(builder);
            ElementalTypeRelation.ConfigureForDatabase(builder);
            Ability.ConfigureForDatabase(builder);
            PvpTier.ConfigureForDatabase(builder);
            PokemonAvailability.ConfigureForDatabase(builder);
            PokemonVarietyUrl.ConfigureForDatabase(builder);

            Entities.PokemonSpecies.ConfigureForDatabase(builder);
            PokemonVariety.ConfigureForDatabase(builder);
            PokemonForm.ConfigureForDatabase(builder);
            Evolution.ConfigureForDatabase(builder);

            MoveDamageClass.ConfigureForDatabase(builder);
            Move.ConfigureForDatabase(builder);
            MoveTutor.ConfigureForDatabase(builder);
            MoveTutorMove.ConfigureForDatabase(builder);
            MoveTutorMovePrice.ConfigureForDatabase(builder);
            MoveLearnMethod.ConfigureForDatabase(builder);
            MoveLearnMethodLocation.ConfigureForDatabase(builder);
            MoveLearnMethodLocationPrice.ConfigureForDatabase(builder);
            LearnableMove.ConfigureForDatabase(builder);
            LearnableMoveLearnMethod.ConfigureForDatabase(builder);

            TimeOfDay.ConfigureForDatabase(builder);
            Season.ConfigureForDatabase(builder);
            SeasonTimeOfDay.ConfigureForDatabase(builder);
            SpawnType.ConfigureForDatabase(builder);
            Spawn.ConfigureForDatabase(builder);
            SpawnOpportunity.ConfigureForDatabase(builder);

            Nature.ConfigureForDatabase(builder);
            HuntingConfiguration.ConfigureForDatabase(builder);
            Build.ConfigureForDatabase(builder);
            ItemOption.ConfigureForDatabase(builder);
            MoveOption.ConfigureForDatabase(builder);
            NatureOption.ConfigureForDatabase(builder);

            ItemStatBoost.ConfigureForDatabase(builder);
            Entities.ItemStatBoostPokemon.ConfigureForDatabase(builder);

            ImportSheet.ConfigureForDatabase(builder);
        }
        private PokemonVariety UpdatePokemonVariety(
            PokemonVariety dbVariety, PokemonVariety newVariety, string idHash)
        {
            var variety = dbVariety ?? newVariety;

            var pvpTiers       = _dbContext.PvpTiers.ToList();
            var abilities      = _dbContext.Abilities.ToList();
            var elementalTypes = _dbContext.ElementalTypes.ToList();

            var speciesList = _dbContext.PokemonSpecies
                              .IncludeOptimized(s => s.Varieties)
                              .IncludeOptimized(s => s.DefaultVariety)
                              .ToList();

            variety.ResourceName     = newVariety.ResourceName;
            variety.Name             = newVariety.Name;
            variety.PokeApiName      = newVariety.PokeApiName;
            variety.DoInclude        = newVariety.DoInclude;
            variety.IsMega           = newVariety.IsMega;
            variety.IsFullyEvolved   = newVariety.IsFullyEvolved;
            variety.Generation       = newVariety.Generation;
            variety.CatchRate        = newVariety.CatchRate;
            variety.HasGender        = newVariety.HasGender;
            variety.MaleRatio        = newVariety.MaleRatio;
            variety.EggCycles        = newVariety.EggCycles;
            variety.Height           = newVariety.Height;
            variety.Weight           = newVariety.Weight;
            variety.ExpYield         = newVariety.ExpYield;
            variety.Attack           = newVariety.Attack;
            variety.Defense          = newVariety.Defense;
            variety.SpecialAttack    = newVariety.SpecialAttack;
            variety.SpecialDefense   = newVariety.SpecialDefense;
            variety.Speed            = newVariety.Speed;
            variety.HitPoints        = newVariety.HitPoints;
            variety.AttackEv         = newVariety.AttackEv;
            variety.DefenseEv        = newVariety.DefenseEv;
            variety.SpecialAttackEv  = newVariety.SpecialAttackEv;
            variety.SpecialDefenseEv = newVariety.SpecialDefenseEv;
            variety.SpeedEv          = newVariety.SpeedEv;
            variety.HitPointsEv      = newVariety.HitPointsEv;
            variety.Notes            = newVariety.Notes;

            var primaryType = elementalTypes.SingleOrDefault(e => e.Name.EqualsExact(newVariety.PrimaryType.Name));

            if (primaryType is null)
            {
                _reporter.ReportError(Entity.PokemonForm, idHash,
                                      $"Could not find primary type {newVariety.PrimaryType.Name} for PokemonVariety {newVariety.Name}, skipping.");

                return(null);
            }

            ElementalType secondaryType = null;

            if (newVariety.SecondaryType != null)
            {
                secondaryType = elementalTypes.SingleOrDefault(e => e.Name.EqualsExact(newVariety.SecondaryType.Name));
                if (secondaryType is null)
                {
                    _reporter.ReportError(Entity.PokemonForm, idHash,
                                          $"Could not find secondary type {newVariety.SecondaryType.Name} for PokemonVariety {newVariety.Name}, setting null.");
                }
            }

            var primaryAbility = abilities.SingleOrDefault(a => a.Name.EqualsExact(newVariety.PrimaryAbility.Name));

            if (primaryAbility is null)
            {
                _reporter.ReportError(Entity.PokemonForm, idHash,
                                      $"Could not find primary ability {newVariety.PrimaryAbility.Name} for PokemonVariety {newVariety.Name}, skipping.");

                return(null);
            }

            Ability secondaryAbility = null;

            if (newVariety.SecondaryAbility != null)
            {
                secondaryAbility = abilities.SingleOrDefault(a => a.Name.EqualsExact(newVariety.SecondaryAbility.Name));
                if (secondaryAbility is null)
                {
                    _reporter.ReportError(Entity.PokemonForm, idHash,
                                          $"Could not find secondary ability {newVariety.SecondaryAbility.Name} for PokemonVariety {newVariety.Name}, setting null.");
                }
            }

            Ability hiddenAbility = null;

            if (newVariety.HiddenAbility != null)
            {
                hiddenAbility = abilities.SingleOrDefault(a => a.Name.EqualsExact(newVariety.HiddenAbility.Name));
                if (hiddenAbility is null)
                {
                    _reporter.ReportError(Entity.PokemonForm, idHash,
                                          $"Could not find hidden ability {newVariety.HiddenAbility.Name} for PokemonVariety {newVariety.Name}, setting null.");
                }
            }

            var pvpTier = pvpTiers.SingleOrDefault(p => p.Name.EqualsExact(newVariety.PvpTier.Name));

            if (pvpTier is null)
            {
                _reporter.ReportError(Entity.PokemonForm, idHash,
                                      $"Could not find pvp tier {newVariety.PvpTier.Name} for PokemonVariety {newVariety.Name}, skipping.");

                return(null);
            }

            variety.PrimaryTypeId      = primaryType.Id;
            variety.PrimaryType        = primaryType;
            variety.SecondaryTypeId    = secondaryType?.Id;
            variety.SecondaryType      = secondaryType;
            variety.PrimaryAbilityId   = primaryAbility.Id;
            variety.PrimaryAbility     = primaryAbility;
            variety.SecondaryAbilityId = secondaryAbility?.Id;
            variety.SecondaryAbility   = secondaryAbility;
            variety.HiddenAbilityId    = hiddenAbility?.Id;
            variety.HiddenAbility      = hiddenAbility;
            variety.PvpTierId          = pvpTier.Id;
            variety.PvpTier            = pvpTier;

            var dbSpecies = speciesList.SingleOrDefault(s => s.Name.EqualsExact(newVariety.PokemonSpecies.Name));
            var species   = dbSpecies ?? variety.PokemonSpecies;

            species.PokedexNumber = variety.PokemonSpecies.PokedexNumber;
            species.Name          = variety.PokemonSpecies.Name;
            species.PokeApiName   = variety.PokemonSpecies.PokeApiName;

            variety.PokemonSpeciesId = species.Id;
            variety.PokemonSpecies   = species;

            return(variety);
        }