Объемные вставки с EF4.2 - PullRequest
       3

Объемные вставки с EF4.2

1 голос
/ 08 марта 2012

У нас огромная проблема с производительностью в нашем приложении, мы собираем данные из разных систем и сохраняем их в нашей БД для последующего генерирования некоторых отчетов.

Мы используем Entity Framework 4.2 и DbSets. Есть ли лучший способ делать массовые вставки, чем метод Add для каждого объекта в DbSet? Потому что с логикой добавления

возникают огромные проблемы с производительностью
oneThousandCustomers.Foreach(c => context.Customers.Add(c)); //This will take a minute
context.SaveChanges(); //This takes under a second

Я полагаю, что метод add делает много поисков и так далее и тому подобное, но я просто хочу массово вставить эти данные. Возможно ли это?

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Хорошо, так что дело в том, что 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

0 голосов
/ 08 марта 2012

Вы можете использовать LinqEntityDataReader , чтобы выполнить SqlBulkCopy для коллекции сущностей, что улучшит производительность, введите описание ссылки здесь в вашем приложении.

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