Те же темы обсуждались здесь 8 месяцев назад: Как ускорить DbSet.Add()?. Не было предложено никаких решений, кроме использования SqlBulkCopy, что неприемлемо для нас. Я решил снова поднять его, надеясь, что могут возникнуть новые мысли и идеи вокруг этой проблемы, и предлагаются другие обходные пути. По крайней мере, мне просто интересно, почему эта операция занимает очень много времени.
Ну, проблема в том, что я должен обновить 30 тыс. объектов в базе данных (EF 4.1, POCO). Тип сущности довольно простой, содержащий целочисленные id + другие 4 целочисленные свойства без каких-либо отношений с другими типами. 2 случая:
-
все это новые записи. Запуск context.Entities.Add(сущность) один за другим для каждого объекта занимает 90 секунд с Cntx.Configuration.AutoDetectChangesEnabled = false (истинное значение заставляет его работать вечно). Затем SaveChanges занимает всего секунду. Другой подход: привязка его к контексту, подобному этому, занимает те же 90 секунд:
Cntx.Entities.Attach(entity); Cntx.Entry(entity).State = EntityState.Added;
-
все это существующие записи с некоторыми изменениями. В этом случае требуется всего несколько миллисекунд, чтобы привязать его к существующему контексту данных следующим образом:
Cntx.Entities.Attach(entity); Cntx.Entry(entity).State = EntityState.Modified;
См. разницу?
Что стоит за сценой метода Add, которая заставляет его работать так невероятно медленно?