Массовая вставка в Entity Framework v6.1

Наше приложение для здравоохранения использует трехуровневую архитектуру (AngularjS + MVC + WebAPI). Я загружаю лист Excel и выполняю сопоставление столбцов на экране импорта. После этого я выполняю все проверки для каждой n каждой записи на листе Excel. Затем все эти 50 000 строк в виде сущностей передаются на уровень Web-API. Здесь я вставляю одну запись в родительскую таблицу, чтобы получить первичный ключ. Получив его, я перебираю 50 тыс. сущностей, чтобы обновить его в коллекции. Затем я использую addRange для обновления всех этих значений в базе данных. Вот фрагмент кода, который мы использовали в приложении.

            db.tableA.Add(Entity1);

            db.SaveChanges();

            (Primary Key) fileId = int.Parse(Entity1.Id.ToString());


//DataList having 50K Entities
            foreach (tableB coll in DataList)

            {

                coll.fileID = fileId;                    

            }

            db.tableB.AddRange(DataList);

            db.SaveChanges();

Упомянутые ниже ссылки. Массовая вставка в структуру объекта

Как использовать массовую вставку в Entity Framework с использованием объекта Контекст?

Массовая вставка в структуру объекта

Но я не мог использовать EntityFramework.BulkInsert, поскольку он не совместим с последней версией EF (6.1). Есть ли другой жизнеспособный подход к использованию массовой вставки с использованием EF? Также мы можем использовать SqlBulkCopy в Entity Framework?


person SivaRajini    schedule 28.09.2016    source источник
comment
Да, вы можете просто использовать SqlBulkCopy в том же проекте, в котором вы используете EF.   -  person Łukasz Trzewik    schedule 28.09.2016
comment
@ Лукас, да. Есть ли возможность использовать массовую вставку в EF версии 6.1?   -  person SivaRajini    schedule 28.09.2016
comment
@SivaRajini, почему? Массовая вставка не имеет ничего общего с объектами. Массовая вставка означает максимально быструю отправку потока записей в базу данных. ORM имеет дело с отображениями и классами, а не с записями. Это неправильный инструмент для работы   -  person Panagiotis Kanavos    schedule 28.09.2016
comment
@SivaRajini предоставленные вами ссылки в конечном итоге преобразуют сущности в экземпляры DataTable или DataRow, а затем с помощью SqlBulkCopy. В итоге вы платите за конверсию дважды: сначала за создание сущностей, а затем за преобразование сущностей в таблицы данных. Вместо этого просто создайте фактические таблицы данных.   -  person Panagiotis Kanavos    schedule 28.09.2016
comment
@SivaRajini, в какой форме ваши исходные записи? DTO, DataTable, строка Json?   -  person Panagiotis Kanavos    schedule 28.09.2016


Ответы (1)


Вот альтернативное решение с использованием другой сторонней библиотеки (совместимо с Entity Framework 6.1)

Отказ от ответственности: я являюсь владельцем проекта Entity Framework Extensions

Эта библиотека совместима со всеми Entity Framework версии 6.X.

Он делает больше, чем просто массовая вставка, позволяя выполнять все массовые операции, которые могут потребоваться вашему приложению:

  • BulkSaveChanges
  • Массовая вставка
  • Массовое обновление
  • BulkDelete
  • Массовое слияние

Пример

// Easy to use
context.BulkSaveChanges();

// Easy to customize
context.BulkSaveChanges(bulk => bulk.BatchSize = 100);

Библиотека поддерживает все виды наследования и ассоциации, однако библиотека не бесплатна.

person Jonathan Magnan    schedule 28.09.2016
comment
Это бесплатно или с открытым исходным кодом? - person SivaRajini; 29.09.2016
comment
Библиотека, к сожалению, платная. Это недостаток получения поддержки и наличия библиотеки, которая поддерживает все. - person Jonathan Magnan; 29.09.2016