Member 14119435 Ответов: 2

Как использовать шаблон репозитория и единицу работы для массовой вставки с EF и дать больше производительности?


Привет. Я работаю над проектом, который использует unit of work и repository pattern с orm EF6.
я хочу вставить список объектов около 800k записей в базу данных.
я отправляю каждую запись 15k или 10k в экземпляр репозитория, а затем фиксирую ее.
это слишком медленно. как я могу дать больше производительности?
я не хочу устанавливать EF.Расширения.
моя проблема связана с циклом foreach. его слишком медленно добавляют в репозиторий.

Что я уже пробовал:

foreach (var imei in command.IMEIItems) {

var newIMEI = новый IMEI(imei.IMEINumber, команда.PromotionId);
_imeiRepository.Добавить(newIMEI);
}

_unitOfWork.Совершать();

2 Ответов

Рейтинг:
7

johannesnestler

То, что сказал Дэйв, отчасти верно, и для реального импорта больших данных стоит попробовать. Я просто хотел заметить, что я предлагаю метод AddRange в своем репозитории-Impl и do DataContext.Экономьте только один раз - так что для обычных случаев использования практичный способ - кстати. Никогда не смотрите на производительность EF в отладке, без предварительного JIT или если EF-представления еще не сгенерированы (вы также можете сгенерировать их заранее). Поэтому всегда создавайте релиз - запускайте, а затем снова запускайте и делайте свои измерения производительности.


Рейтинг:
14

Dave Kreskowiak

Вы не можете действительно улучшить производительность, используя обычный ванильный EF. Независимо от того, что вы делаете, EF всегда будет делать по одной вставке за раз для каждого добавляемого элемента. Нет никакого способа ускорить это.

Я бы предложил выйти за пределы EF для этого и использовать SqlBulkCopy[^] класс вместо этого. Вам придется сделать немного больше работы, чтобы настроить эту операцию, но это определенно будет намного быстрее, чем EF.