Большинство приложений EF используют постоянные неосведомленные объекты POCO и отслеживание изменений моментальных снимков. Это означает, что в самих сущностях нет кода для отслеживания изменений или уведомления контекста изменений.
При использовании большинства объектов POCO определение того, как сущность изменилось (и, следовательно, какие обновления необходимо отправить в базу данных), обрабатывается алгоритмом обнаружения изменений. Обнаружение изменений работает, обнаруживая различия между текущими значениями свойств объекта и исходными значениями свойств, которые хранятся в моментальном снимке, когда объект был запрошен или присоединен.
Обнаружение изменения моментального снимка принимает копию каждого объекта в системе, когда они добавляются в диаграмму отслеживания структуры Entity Framework. Затем, когда сущности изменяют каждую сущность, ее сравнивают с ее снимком, чтобы увидеть какие-либо изменения. Это происходит путем вызова метода DetectChanges. Важно знать об DetectChanges, так это то, что он должен проходить через все ваши отслеживаемые объекты каждый раз при его вызове, поэтому чем больше вещей у вас в вашем контексте, тем больше времени требуется для прохождения.
Что такое автоматическое обнаружение изменений, является подключением к событиям, которые происходят в контексте, и вызывает обнаружение изменений по мере их возникновения.
Всякий раз, когда вы добавляете новый объект User, EF внутренне отслеживает его &, сохраняя текущее состояние вновь добавленного объекта в его снимке. Для операций массовой вставки EF сначала вставляет все записи в DB &, а затем вызывает функцию DetectChanges. Таким образом, время выполнения, необходимое для массовой вставки, - это время, необходимое для вставки всех записей + времени, необходимого для обновления контекста EF.
Вы можете сделать свою установку DB относительно быстрее, отключив AutoDetectChanges
. Так что ваш код будет выглядеть,
using (var context = new YourContext())
{
try
{
context.Configuration.AutoDetectChangesEnabled = false;
// do your DB operations
}
finally
{
context.Configuration.AutoDetectChangesEnabled = true;
}
}
У вас есть индексы на таблицах? Как скорость вашего интернет-соединения? Является ли вставка, когда вы локальны или когда она находится на производстве на сервере Azure? – krillgar
Это совершенно новый db и стол. У меня 50-мегабайтная загрузка. Вставка почти такая же локальная, как и в производстве на Azure. – redlaz
У вас может быть 50-минутная загрузка - но что такое LATENCY? Если вы находитесь на расстоянии 100 мс от своей лазурной базы данных, это не совсем неуместно. – TomTom