Как массово вставить EF-сущности, используя DbContextScopeFactory - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь добавить несколько тысяч объектов, но у меня проблемы с производительностью. Чтобы вставить 200 записей, нужны годы.

Вот логика:

  private readonly ICrawlerRepository _crawlerRepository;
    //...
    using (var dbContextScope = _dbContextScopeFactory.Create())
    {
         var items = scanItemsToAdd.Skip(i).Take(200).ToList();

     _crawlerRepository.AddScanItems(items);

     dbContextScope.SaveChanges();
}

Вот слой репозитория

public class CrawlerRepository {

    public void AddScanItems(ICollection<ScanItem> scanItems)
    {
            // Attempt to speed up the process, but don't make any difference ->
            DbContext.Configuration.AutoDetectChangesEnabled = false;

            foreach (var si in scanItems)
            {
                //gets "stuck" by running the following line
                DbContext.Entry(si.ScanBase).State = EntityState.Unchanged;
                DbContext.Entry(si.FileType).State = EntityState.Unchanged;
            }
            DbContext.ScanItems.AddRange(scanItems);

            DbContext.Configuration.AutoDetectChangesEnabled = true;
    }
}

Я что-то упустил? Цель этой вставки - добавить записи в базу данных независимо от реляционных таблиц, так как я делаю свои собственные проверки для добавляемых объектов, так что это должно быть довольно простым, если для свойства AutoDetectChangesEnabled установлено значение false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...