/// <summary> /// Loads the family data. /// </summary> /// <param name="csvData">The CSV data.</param> private int LoadFamily(CSVInstance csvData) { // Required variables var lookupContext = new RockContext(); var locationService = new LocationService(lookupContext); int familyGroupTypeId = GroupTypeCache.GetFamilyGroupType().Id; int numImportedFamilies = ImportedFamilies.Count(); int homeLocationTypeId = DefinedValueCache.Read(new Guid(Rock.SystemGuid.DefinedValue.GROUP_LOCATION_TYPE_HOME)).Id; int workLocationTypeId = DefinedValueCache.Read(new Guid(Rock.SystemGuid.DefinedValue.GROUP_LOCATION_TYPE_WORK)).Id; var newGroupLocations = new Dictionary <GroupLocation, string>(); var currentFamilyGroup = new Group(); var newFamilyList = new List <Group>(); var updatedFamilyList = new List <Group>(); var dateFormats = new[] { "yyyy-MM-dd", "MM/dd/yyyy", "MM/dd/yy" }; string currentFamilyKey = string.Empty; int completed = 0; ReportProgress(0, string.Format("Starting family import ({0:N0} already exist).", numImportedFamilies)); string[] row; // Uses a look-ahead enumerator: this call will move to the next record immediately while ((row = csvData.Database.FirstOrDefault()) != null) { string rowFamilyKey = row[FamilyId]; int? rowFamilyId = rowFamilyKey.AsType <int?>(); string rowFamilyName = row[FamilyName]; if (rowFamilyKey != null && rowFamilyKey != currentFamilyGroup.ForeignKey) { currentFamilyGroup = ImportedFamilies.FirstOrDefault(g => g.ForeignKey == rowFamilyKey); if (currentFamilyGroup == null) { currentFamilyGroup = new Group(); currentFamilyGroup.ForeignKey = rowFamilyKey; currentFamilyGroup.ForeignId = rowFamilyId; currentFamilyGroup.Name = row[FamilyName]; currentFamilyGroup.CreatedByPersonAliasId = ImportPersonAliasId; currentFamilyGroup.GroupTypeId = familyGroupTypeId; newFamilyList.Add(currentFamilyGroup); } else { lookupContext.Groups.Attach(currentFamilyGroup); } // Set the family campus string campusName = row[Campus]; if (!string.IsNullOrWhiteSpace(campusName)) { var familyCampus = CampusList.Where(c => c.Name.Equals(campusName, StringComparison.InvariantCultureIgnoreCase) || c.ShortCode.Equals(campusName, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault(); if (familyCampus == null) { familyCampus = new Campus(); familyCampus.IsSystem = false; familyCampus.Name = campusName; familyCampus.ShortCode = campusName.RemoveWhitespace(); lookupContext.Campuses.Add(familyCampus); lookupContext.SaveChanges(DisableAuditing); CampusList.Add(familyCampus); } currentFamilyGroup.CampusId = familyCampus.Id; } // Add the family addresses since they exist in this file string famAddress = row[Address]; string famAddress2 = row[Address2]; string famCity = row[City]; string famState = row[State]; string famZip = row[Zip]; string famCountry = row[Country]; Location primaryAddress = locationService.Get(famAddress, famAddress2, famCity, famState, famZip, famCountry, verifyLocation: false); if (primaryAddress != null) { var primaryLocation = new GroupLocation(); primaryLocation.LocationId = primaryAddress.Id; primaryLocation.IsMailingLocation = true; primaryLocation.IsMappedLocation = true; primaryLocation.GroupLocationTypeValueId = homeLocationTypeId; newGroupLocations.Add(primaryLocation, rowFamilyKey); } string famSecondAddress = row[SecondaryAddress]; string famSecondAddress2 = row[SecondaryAddress2]; string famSecondCity = row[SecondaryCity]; string famSecondState = row[SecondaryState]; string famSecondZip = row[SecondaryZip]; string famSecondCountry = row[SecondaryCountry]; Location secondaryAddress = locationService.Get(famSecondAddress, famSecondAddress2, famSecondCity, famSecondState, famSecondZip, famSecondCountry, verifyLocation: false); if (secondaryAddress != null) { var secondaryLocation = new GroupLocation(); secondaryLocation.LocationId = secondaryAddress.Id; secondaryLocation.IsMailingLocation = true; secondaryLocation.IsMappedLocation = true; secondaryLocation.GroupLocationTypeValueId = workLocationTypeId; newGroupLocations.Add(secondaryLocation, rowFamilyKey); } DateTime createdDateValue; if (DateTime.TryParseExact(row[CreatedDate], dateFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out createdDateValue)) { currentFamilyGroup.CreatedDateTime = createdDateValue; currentFamilyGroup.ModifiedDateTime = ImportDateTime; } else { currentFamilyGroup.CreatedDateTime = ImportDateTime; currentFamilyGroup.ModifiedDateTime = ImportDateTime; } completed++; if (completed % (ReportingNumber * 10) < 1) { ReportProgress(0, string.Format("{0:N0} families imported.", completed)); } else if (completed % ReportingNumber < 1) { SaveFamilies(newFamilyList, newGroupLocations); ReportPartialProgress(); // Reset lookup context lookupContext.SaveChanges(); lookupContext = new RockContext(); locationService = new LocationService(lookupContext); newFamilyList.Clear(); newGroupLocations.Clear(); } } } // Check to see if any rows didn't get saved to the database if (newGroupLocations.Any()) { SaveFamilies(newFamilyList, newGroupLocations); } lookupContext.SaveChanges(); DetachAllInContext(lookupContext); lookupContext.Dispose(); ReportProgress(0, string.Format("Finished family import: {0:N0} families added or updated.", completed)); return(completed); }
/// <summary> /// Loads the family data. /// </summary> /// <param name="csvData">The CSV data.</param> private int LoadFamily(CSVInstance csvData) { // Required variables var lookupContext = new RockContext(); var locationService = new LocationService(lookupContext); var newGroupLocations = new Dictionary <GroupLocation, string>(); var currentFamilyGroup = new Group(); var newFamilyList = new List <Group>(); var updatedFamilyList = new List <Group>(); var dateFormats = new[] { "yyyy-MM-dd", "MM/dd/yyyy", "MM/dd/yy" }; var currentFamilyKey = string.Empty; var completed = 0; ReportProgress(0, $"Starting family import ({ImportedFamilies.Count():N0} already exist)."); string[] row; // Uses a look-ahead enumerator: this call will move to the next record immediately while ((row = csvData.Database.FirstOrDefault()) != null) { var rowFamilyKey = row[FamilyId]; var rowFamilyId = rowFamilyKey.AsType <int?>(); var rowFamilyName = row[FamilyName]; if (rowFamilyKey != null && rowFamilyKey != currentFamilyGroup.ForeignKey) { currentFamilyGroup = ImportedFamilies.FirstOrDefault(g => g.ForeignKey == rowFamilyKey); if (currentFamilyGroup == null) { currentFamilyGroup = new Group { ForeignKey = rowFamilyKey, ForeignId = rowFamilyId, CreatedByPersonAliasId = ImportPersonAliasId, GroupTypeId = FamilyGroupTypeId }; newFamilyList.Add(currentFamilyGroup); } else if (!lookupContext.ChangeTracker.Entries <Group>().Any(g => g.Entity.ForeignKey == rowFamilyKey || (g.Entity.ForeignKey == null && g.Entity.ForeignId == rowFamilyId))) { // track changes if not currently tracking lookupContext.Groups.Attach(currentFamilyGroup); } currentFamilyGroup.Name = row[FamilyName]; // Set the family campus var campusName = row[Campus]; if (!string.IsNullOrWhiteSpace(campusName)) { var familyCampus = CampusList.FirstOrDefault(c => c.Name.Equals(campusName, StringComparison.OrdinalIgnoreCase) || c.ShortCode.Equals(campusName, StringComparison.OrdinalIgnoreCase)); if (familyCampus == null) { familyCampus = new Campus { IsSystem = false, Name = campusName, ShortCode = campusName.RemoveWhitespace(), IsActive = true }; lookupContext.Campuses.Add(familyCampus); lookupContext.SaveChanges(DisableAuditing); CampusList.Add(familyCampus); } currentFamilyGroup.CampusId = familyCampus.Id; lookupContext.SaveChanges(DisableAuditing); } // Add the family addresses since they exist in this file var famAddress = row[Address]; var famAddress2 = row[Address2]; var famCity = row[City]; var famState = row[State]; var famZip = row[Zip]; var famCountry = row[Country]; var primaryAddress = locationService.Get(famAddress.Left(100), famAddress2.Left(100), famCity, famState, famZip, famCountry, verifyLocation: false); if (primaryAddress != null && currentFamilyGroup.GroupLocations.Count == 0) { var primaryLocation = new GroupLocation { LocationId = primaryAddress.Id, IsMailingLocation = true, IsMappedLocation = true, GroupLocationTypeValueId = HomeLocationTypeId }; newGroupLocations.Add(primaryLocation, rowFamilyKey); } var famSecondAddress = row[SecondaryAddress]; var famSecondAddress2 = row[SecondaryAddress2]; var famSecondCity = row[SecondaryCity]; var famSecondState = row[SecondaryState]; var famSecondZip = row[SecondaryZip]; var famSecondCountry = row[SecondaryCountry]; var secondaryAddress = locationService.Get(famSecondAddress.Left(100), famSecondAddress2.Left(100), famSecondCity, famSecondState, famSecondZip, famSecondCountry, verifyLocation: false); if (secondaryAddress != null && currentFamilyGroup.GroupLocations.Count < 2) { var secondaryLocation = new GroupLocation { LocationId = secondaryAddress.Id, IsMailingLocation = true, IsMappedLocation = false, GroupLocationTypeValueId = PreviousLocationTypeId }; newGroupLocations.Add(secondaryLocation, rowFamilyKey); } DateTime createdDateValue; if (DateTime.TryParseExact(row[CreatedDate], dateFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out createdDateValue)) { currentFamilyGroup.CreatedDateTime = createdDateValue; currentFamilyGroup.ModifiedDateTime = ImportDateTime; } else { currentFamilyGroup.CreatedDateTime = ImportDateTime; currentFamilyGroup.ModifiedDateTime = ImportDateTime; } completed++; if (completed % (ReportingNumber * 10) < 1) { ReportProgress(0, $"{completed:N0} families imported."); } if (completed % ReportingNumber < 1) { SaveFamilies(newFamilyList, newGroupLocations); ReportPartialProgress(); // Reset lookup context lookupContext.SaveChanges(); lookupContext.Dispose(); lookupContext = new RockContext(); locationService = new LocationService(lookupContext); newFamilyList.Clear(); newGroupLocations.Clear(); } } } // Check to see if any rows didn't get saved to the database if (newGroupLocations.Any()) { SaveFamilies(newFamilyList, newGroupLocations); } lookupContext.SaveChanges(); DetachAllInContext(lookupContext); lookupContext.Dispose(); ReportProgress(0, $"Finished family import: {completed:N0} families added or updated."); return(completed); }