2017-02-20 29 views
5

Entity Framework может работать очень медленно при массовых вставках/обновлении/удалении. Даже часто предлагаемые настройки для отключения AutoDetectChanges и/или ValidateOnSaveEnabled не всегда помогают.Есть ли непривлекательная альтернатива Z.EntityFramework.Extensions?

Я столкнулся с Z.EntityFramework.Extensions на NuGet, но, похоже, это коммерческий продукт, который будет работать только в течение определенного периода времени.

https://www.nuget.org/packages/Z.EntityFramework.Extensions/

До сих пор, мне нужно на самом деле только BulkInsert(), BulkUpdate() и BulkDelete().

Мой вопрос:

Есть ли надежная некоммерческая библиотека, которая делает почти то же самое, как Z.EntityFramework.Extensions?

Спасибо за любые подсказки!

+0

Для периодического обновления и удаления вы можете использовать https: // GitHub .com/loresoft/EntityFramework.Extended. Для пакетной вставки - просто создайте новый контекст каждые 100 или около того. Поэтому создайте контекст, вставьте 100, сохраните изменения. Затем создайте новый, вставьте следующие 100, сохраните изменения и т. Д. Оберните все это в области транзакций. Это не пакетная вставка, но будет намного быстрее, чем вставка всех объектов в один и тот же контекстный экземпляр. – Evk

+0

ORM вообще * НЕ * подходит для пакетных операций, а тем более массовых вставок. Это похоже на использование пинцета для транспортировки грузовика из гальки. Вы не можете скрыть это расширение. Лучшим вариантом для объемных вставок является использование SqlBulkCopy для выполнения операции * real *, минимально регистрируемой, потоковой массовой вставки. Если вы хотите выполнять массовые обновления, просто используйте оператор appopriate UPDATE.Если вы хотите * UPSERT * из внешних источников, импортируйте все в промежуточную таблицу и используйте MERGE для обновления целевой таблицы. –

+0

Другими словами, вы ищете что-то, что может превратить ненадежный, небезопасный, не масштабируемый процесс в надежный один. Почему бы не использовать надежный, масштабируемый процесс с самого начала? –

ответ

2

Отказ от ответственности: Я владелец Entity Framework Extensions

Вы правы. Это коммерческий продукт.

Каждый месяц предоставляется бесплатная пробная версия, но вам придется приобретать продукт для производственной среды.

Bulk Вставьте

Для BulkInsert, есть некоторые свободные альтернативы, но будьте осторожны, они не поддерживают все уделы & ассоциации и больше не поддерживаются:

Отказ от ответственности: Я владелец Entity Framework Plus

Для пакетного обновления & & Пакетное удаление, вы можете использовать эту библиотеку:

// DELETE all users which has been inactive for 2 years 
ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2)) 
     .Delete(); 

// UPDATE all users which has been inactive for 2 years 
ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2)) 
     .Update(x => new User() { IsSoftDeleted = 1 }); 
+0

Спасибо, Джонатан. Я отмечу это как действительный ответ, потому что, как я думаю, как владелец такого продукта, у вас есть хороший обзор для других конкурентов. Действительно печально, что нет никакой вставки в EF Plus, но я думаю, что должно быть какое-то отличие от коммерческого продукта. – Michael

+1

К сожалению, мы попытались предложить некоторые функции с открытым исходным кодом, но эта бизнес-модель просто не может работать. Так что да, нам нужно провести различие между обеими библиотеками. Проекты с открытым исходным кодом/бесплатные проекты в большинстве случаев терпят неудачу при поддержке через какое-то время, потому что затраты/время/сложность постоянно увеличиваются по мере увеличения количества пользователей. Например, в прошлом году эта бесплатная библиотека занимала у нас больше времени на поддержку, чем наши другие библиотеки вместе взятые! –

+0

Привет, Майкл, просто интересно, столкнулись ли вы с SqlBulkTools во время исследований? –