Хорошо, так что дело в том, что EF делает много вещей в сценах, когда вы добавляете элемент в коллекцию.
По-настоящему важным с точки зрения производительности является то, что он автоматически вызывает DetectChanges () для каждой команды добавления, которая перечисляет весь граф объекта.
Это означает, что если у вас есть большое количество элементов, которые отслеживаются текущим контекстом EF, это вызовет некоторые действительно серьезные проблемы с производительностью.
Вот несколько советов по улучшению производительности, для сравнения я могу вставить 1000 довольно простых сущностей без FK в EF менее чем за 1/2 секунды.
- Убедитесь, что вы используете новый экземпляр контекста EF для своего запроса,
это гарантирует, что ваш график изменений будет маленьким, так что добавление будет
довольно быстро.
- Поворот автоматического определения изменения для DbContext
Код для отключения автоматического обнаружения изменений
context.Configuration.AutoDetectChangesEnabled = false;
При отключении AutoDetectChanges вы должны быть немного осторожнее, так как это означает, что большая часть EF automagic отключена, поэтому вы можете получить некоторые странности, особенно если вы используете свойства навигации или обновляете существующие сущности. Чтобы решить эти проблемы, вызовите DetectChanges непосредственно перед вызовом SaveChanges. Это снизит производительность и не понадобится при простых операциях добавления, поэтому в вашем примере вы, вероятно, можете обойтись без этого.
В этой статье MSDN говорится об этом (обратите внимание, хотя его EF 5 - то же самое в 4) http://msdn.microsoft.com/en-us/library/gg696177%28v=vs.103%29.aspx