Пакетные команды БД в Entity Framework 4.0 - PullRequest
15 голосов
/ 10 декабря 2010

Мой текущий проект требует ежедневной синхронизации с внешней системой. Синхронизация основана на сложной структуре файлов импорта, которая анализируется и обрабатывается с использованием обширной бизнес-логики. Из-за бизнес-логики мы решили сделать это в коде .NET и повторно использовать существующие компоненты BL вместо записи той же логики в хранимых процедурах или службах интеграции.

Уровень BL расположен поверх уровня доступа к данным EF 4.0. Текущая реализация обрабатывает пакет импорта, заполняет все изменения в ObjectContext и выполняет SaveChanges в транзакции. Когда я проверяю профилировщик SQL, я вижу, что EF выполняет каждое изменение сущности как одну команду SQL (со своей собственной передачей данных в БД). Более того, похоже, что эти команды выполняются полностью последовательно. Таким образом, у меня есть до 100 000 обращений к базе данных для первоначального импорта и от 10 000 до 50 000 обращений к базе данных для ежедневной синхронизации.

Можно ли как-то пакетно вводить / обновлять / удалять команды самим EF или каким-либо провайдером / расширением?

Ответы [ 5 ]

9 голосов
/ 10 декабря 2010

Нет, это невозможно сделать (да, я тоже плачу).

EF не поддерживает пакетные операции, у LINQ-SQL была (есть) такая же проблема.

ВыУ меня есть несколько вариантов:

  1. Хранимые процедуры
  2. Классические ADO.NET или EntitySQL
  3. Триггеры

Я ушелс вариантами 1 и 3 в прошлом.

Проблема всех трех подходов заключается в том, что вы теряете абстракцию EF, внутренний граф (оптимистичный параллелизм) и возвращаетесь в мир нативного SQL.

3 голосов
/ 20 мая 2011

В SQL Server есть несколько обходных путей:

В случае, если вы заинтересованы в Oracle,MySQL, POstgreSQL или SQLite, вы можете использовать последние поставщики Devart dotConnect .Функциональность BatchUpdates уже интегрирована в метод SaveChanges в последних версиях этих поставщиков.

3 голосов
/ 29 апреля 2011

Помните об этом проекте: magiq.codeplex.com

Он переносит пакетные операции в linq-to-sql, и мы уже работаем в поддержке EntityFramework.

Cheers

0 голосов
/ 20 октября 2017

Просто делюсь с вами проектом GitHub только для этого, на данный момент он поддерживает прозрачную массовую вставку / обновление / удаление для сервера Sql с помощью SqlBulkCopy.https://github.com/MHanafy/EntityExtensions Есть и другие вкусности, и, надеюсь, это будет расширено, чтобы сделать больше в будущем.Использовать его так же просто, как

var insertsAndupdates = new List<object>();
var deletes = new List<object>();
context.BulkUpdate(insertsAndupdates, deletes);

Надеюсь, это поможет!

0 голосов
/ 01 апреля 2012

Вот способ, который позволяет вам использовать ваш код в первую очередь POCO и работает быстро.Ускорение массовой вставки с> 1 часа до ~ 5 секунд.

SqlBulkCopy для универсального списка (полезно для Entity Framework и NHibernate) .

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