Почему DbSet.Add работает так медленно?

Эта же тема обсуждалась здесь 8 месяцев назад: Как мне ускорить DbSet.Add ()? . Не было предложено никакого решения, кроме использования SqlBulkCopy, что для нас неприемлемо. Я решил поднять этот вопрос еще раз, надеясь, что могут появиться новые мысли и идеи по этому поводу, и предлагаются другие обходные пути. По крайней мере, мне просто любопытно, почему эта операция занимает так много времени.

Проблема в том, что мне нужно обновить 30 КБ объектов в базе данных (EF 4.1, POCO). Тип сущности довольно простой, содержащий целочисленный Id + 4 других целочисленных свойства, не связанных с другими типами. 2 случая:

  • все это новые рекорды. Запуск context.Entities.Add (entity) по одному для каждой сущности занимает 90 секунд с Cntx.Configuration.AutoDetectChangesEnabled = false (истинное значение заставляет его работать вечно). Тогда SaveChanges займет всего секунду. Другой подход: прикрепление его к контексту, как это, занимает те же 90 секунд:

     Cntx.Entities.Attach (entity);
    Cntx.Entry (entity) .State = EntityState.Added;
     
  • все это существующие записи с некоторыми изменениями. В этом случае требуется всего несколько миллисекунд, чтобы прикрепить его к существующему контексту данных, например:

     Cntx.Entities.Attach (entity);
    Cntx.Entry (объект) .State = EntityState.Modified;
     

    Видите разницу?

Что скрывается за методом Add, из-за которого он работает так невероятно медленно?

33
задан Community 23 May 2017 в 12:15
поделиться