public async Task SyncData() { var repository = _repoDataContext.VCSRepositories.FirstOrDefault(x => x.Id == _repoReader.Id); if (repository == null) { repository = new VCSRepository { CrawlerProviderType = _repoReader.GetType().FullName, Id = _repoReader.Id }; _repoDataContext.VCSRepositories.Add(repository); } int totalCount = 0; DateTime dateBefore = DateTime.Now; while (true) { var dateAfter = dateBefore.Subtract(new TimeSpan(DAYS_PER_QUERY, 0, 0, 0)); var commits = (await _repoReader.QueryCommits(dateAfter, dateBefore)).Commits; if (commits == null) { break; } int count = 0; foreach (var crawlerCommit in commits) { var authorId = crawlerCommit.AuthorId; var account = _repoDataContext.RepositoryAccounts.Find(repository.Id, authorId); Model.User user; var c = _repoDataContext.Commits.Find(crawlerCommit.Id); if (c != null) { continue; } if (account == null) { var accountInfo = crawlerCommit.Author ?? await _repoReader.GetAuthorDetail(authorId); if (accountInfo == null) continue; account = new RepoAccount { AccountId = authorId, SourceRepoId = repository.Id, Email = accountInfo.Email, Name = accountInfo.Name, SourceRepository = repository }; _repoDataContext.RepositoryAccounts.Add(account); user = new Model.User { Accounts = new List<RepoAccount> {account}, FullName = account.Name }; _repoDataContext.Users.Add(user); } else { user = _repoDataContext.Users.Find(account.PersonId); } if (user == null) { Console.WriteLine("Error, cannot find person"); continue; } var commit = new Model.Commit { Id = crawlerCommit.Id, VSCAuthorAccountId = account.AccountId, VSCRepositoryId = repository.Id, AuthorRepoAccount = account, Created = crawlerCommit.Created, Deletions = crawlerCommit.Deletions, Insertions = crawlerCommit.Insertions, Source = repository, ProjectId = crawlerCommit.ProjectName, Message = crawlerCommit.Message }; _repoDataContext.Commits.Add(commit); count++; totalCount++; } _repoDataContext.SaveChanges(); if (count == 0) break; Console.WriteLine($"Total: {totalCount}, Last insert: {count}, Currert period: {dateBefore.ToString("d")}"); dateBefore = dateAfter; } //_repoDataContext.SaveChanges(); }