Пакетирование команд БД в Entity Framework 4.0 в

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

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

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

5 ответов


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

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

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

  1. Хранимых Процедур
  2. классический ADO.NET или EntitySQL
  3. триггеры

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

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


знайте об этом проекте: magiq.codeplex.com

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

Ура


в SQL Server Есть некоторые обходные пути:

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


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

SqlBulkCopy для общего списка (полезно для Entity Framework & NHibernate).


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

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

надеюсь, что это помогает!