Пакетирование команд БД в 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 имел (имеет) ту же проблему.
У вас есть несколько вариантов:
- Хранимых Процедур
- классический ADO.NET или EntitySQL
- триггеры
Я пошел с вариантом 1 и 3 в прошлом.
проблема со всеми тремя подходами заключается в том, что вы теряете абстракцию EF, внутренний граф (оптимистичный параллелизм), и вы вернулись в мир собственного SQL.
знайте об этом проекте: magiq.codeplex.com
Он приносит пакетные операции в linq-to-sql, и мы уже работаем в поддержке EntityFramework.
Ура
в SQL Server Есть некоторые обходные пути:
пакетные вставки описаны в Массовая Копия Entity Framework статьи
пакетные обновления (и удаления) описаны в несколько обновлений сущностей с Entity Framework-EF Fetch Updates статьи.
Если вас интересует 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);
надеюсь, что это помогает!