public IEnumerable <TEntity> Map(IDictionary <RowHash, TDto> dtosWithHashes) { if (dtosWithHashes is null) { throw new ArgumentNullException(nameof(dtosWithHashes)); } var uniqueNames = new HashSet <string>(); foreach (var(rowHash, dto) in dtosWithHashes) { if (!IsValid(dto)) { Reporter.ReportError(Entity, rowHash.IdHash, $"Found invalid {Entity} DTO. Skipping."); continue; } var uniqueName = GetUniqueName(dto); if (uniqueName != null && uniqueNames.Contains(uniqueName)) { Reporter.ReportError(Entity, rowHash.IdHash, $"Found duplicate {Entity} '{uniqueName}'. Skipping duplicate."); continue; } uniqueNames.Add(uniqueName); yield return(MapEntity(dto, rowHash)); } }
private Dictionary <RowHash, TDto> ReadWithHashes(Dictionary <RowHash, List <object> > rowData) { var result = new Dictionary <RowHash, TDto>(); foreach (var(key, values) in rowData) { try { var dto = _parser.ReadRow(values); result.Add(key, dto); } catch (InvalidRowDataException ex) { Reporter.ReportError(Entity, key.IdHash, ex); } } return(result); }
public int Insert(Dictionary <RowHash, List <object> > rowData) { var availabilities = _dbContext.PokemonAvailabilities.ToList(); var varieties = _dbContext.PokemonVarieties .IncludeOptimized(v => v.PokemonSpecies) .IncludeOptimized(v => v.Forms) .IncludeOptimized(v => v.DefaultForm) .IncludeOptimized(v => v.PrimaryType) .IncludeOptimized(v => v.SecondaryType) .IncludeOptimized(v => v.PrimaryAbility) .IncludeOptimized(v => v.SecondaryAbility) .IncludeOptimized(v => v.HiddenAbility) .IncludeOptimized(v => v.PvpTier) .IncludeOptimized(v => v.Urls) .ToList(); var dtosWithHashes = ReadWithHashes(rowData); var entities = _mapper.Map(dtosWithHashes).ToList(); for (var i = 0; i < entities.Count; i++) { var entity = entities[i]; var availability = availabilities.SingleOrDefault(a => a.Name.EqualsExact(entity.Availability.Name)); if (availability is null) { _reporter.ReportError(Entity.PokemonForm, entity.IdHash, $"Could not find availability {entity.Availability.Name} for PokemonForm {entity.Name}, skipping."); entities.Remove(entity); i--; continue; } entity.AvailabilityId = availability.Id; entity.Availability = availability; var pokemonVariety = varieties.SingleOrDefault(s => s.Name.EqualsExact(entity.PokemonVariety.Name)); // If PokemonVariety already exists, update it (else add the new one) var variety = UpdatePokemonVariety(pokemonVariety, entity.PokemonVariety, entity.IdHash); if (variety is null) { entities.Remove(entity); i--; continue; } entity.PokemonVariety = variety; entity.PokemonVarietyId = variety.Id; } // Save default forms and default varieties, then remove them temporarily for initial insert. var defaultForms = entities .Select(f => f.PokemonVariety) .Distinct() .ToDictionary(v => v.Name, v => v.DefaultForm.Name); var defaultVarieties = entities .Select(f => f.PokemonVariety.PokemonSpecies) .Distinct() .ToDictionary(s => s.Name, s => s.DefaultVariety.Name); entities.Select(f => f.PokemonVariety).ToList().ForEach(v => v.DefaultForm = null); entities.Select(f => f.PokemonVariety.PokemonSpecies).ToList().ForEach(s => s.DefaultVariety = null); _dbContext.PokemonForms.AddRange(entities); _dbContext.SaveChanges(); // Attach Default form and default variety varieties = _dbContext.PokemonVarieties.ToList(); var forms = _dbContext.PokemonForms.ToList(); for (var i = 0; i < entities.Count; i++) { var entity = entities[i]; var defaultForm = forms.SingleOrDefault(f => f.Name.EqualsExact(defaultForms[entity.PokemonVariety.Name])); if (defaultForm is null) { _reporter.ReportError(Entity.PokemonForm, entity.IdHash, $"Could not find default form {entity.PokemonVariety.DefaultForm.Name} " + $"for PokemonForm {entity.Name}, skipping."); entities.Remove(entity); i--; continue; } entity.PokemonVariety.DefaultFormId = defaultForm.Id; entity.PokemonVariety.DefaultForm = defaultForm; var defaultVariety = varieties .SingleOrDefault(v => v.Name.EqualsExact(defaultVarieties[entity.PokemonVariety.PokemonSpecies.Name])); if (defaultVariety is null) { _reporter.ReportError(Entity.PokemonForm, entity.IdHash, $"Could not find default variety {entity.PokemonVariety.PokemonSpecies.DefaultVariety.Name} " + $"for PokemonForm {entity.Name}, skipping."); entities.Remove(entity); i--; continue; } entity.PokemonVariety.PokemonSpecies.DefaultVarietyId = defaultVariety.Id; entity.PokemonVariety.PokemonSpecies.DefaultVariety = defaultVariety; } _dbContext.SaveChanges(); DeleteOrphans(); entities.ForEach(e => _reporter.ReportAdded(Entity.PokemonForm, e.IdHash, e.Id)); return(entities.Count); }