public void Fetch() { using (var uow = (IUnitOfWork)_services.GetService(typeof(IUnitOfWork))) { var sportRepository = uow.GetRepository <Sport>(); //can be stored in memory and update it after each feed pull var currentSport = sportRepository .FirstOrDefault(x => x.Id == SoccerId, include: x => x.Include(sp => sp.Events) .ThenInclude(ev => ev.Matches) .ThenInclude(ma => ma.Bets) .ThenInclude(bet => bet.Odds)); //var updatedSport = _feed.GetSports(SoccerId); var updatedSport = XmlUtils.Deserialize <XmlSportsModel>(XmlUtils.GetXmlString("soccer.xml")); var currentSportModel = _mapper.Map <SportModel>(currentSport); if (currentSport == null)// Initial DB seed { var newSport = _mapper.Map <Sport>(updatedSport.Sport); sportRepository.Add(newSport); } else { var syncRequirement = DiffChecker.GetSyncRequirement(currentSportModel.Events, updatedSport.Sport.Events); if (syncRequirement.IsSyncRequired) { //this is the proper way for db Sync //eventRepository.Sync(updatedEventEntities); // this is a workaround on Sync method. For more info check README.md SyncEventInDb(currentSport, updatedSport.Sport, syncRequirement, uow); } } uow.BulkSaveChanges(); } }