Группирование команд DB в Entity Framework 4.0

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

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

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

Ответ 1

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

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

У вас есть несколько вариантов:

  • Сохраненные процедуры
  • Классический ADO.NET или EntitySQL
  • Триггеры

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

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

Ответ 2

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

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

Приветствия

Ответ 3

В SQL Server существуют некоторые обходные пути:

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

Ответ 5

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

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

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