Избегайте обходов при импорте данных из Excel - PullRequest
0 голосов
/ 21 сентября 2011

Я использую EF 4.1 (Code First). Мне нужно добавить / обновить продукты в базе данных на основе данных из файла Excel. Обсуждая здесь, один из способов добиться этого - использовать dbContext.Products.ToList () для принудительной загрузки всех продуктов из базы данных, а затем использовать db.Products.Local.FirstOrDefault (...), чтобы проверить, существует ли продукт из Excel в базе данных, и продолжить соответственно со вставкой или дополнением. Это только одна поездка туда и обратно.

Теперь моя проблема в том, что в базе данных есть два продукта, поэтому невозможно загрузить все продукты в память. Как это сделать, не увеличивая количество обращений к базе данных? Насколько я понимаю, если я просто выполню поиск с помощью db.Products.FirstOrDefault (...) для каждого продукта Excel, который нужно обработать, это будет выполнять циклическую обработку каждый раз, даже если я несколько раз выдаю утверждение для одного и того же продукта ! Какова цель кэширования объектов EF и возврата кэшированного значения, если оно все равно поступает в базу данных!

1 Ответ

1 голос
/ 21 сентября 2011

На самом деле нет способа сделать это лучше.EF не является хорошим решением для такого рода задач.Вы должны знать, если продукт уже существует в базе данных для правильной работы, поэтому вам всегда нужно выполнять дополнительный запрос - вы можете сгруппировать несколько продуктов в один запрос, используя .Contains (например, SQL IN), но это решит только проблему проверки.Хуже всего то, что каждый INSERT или UPDATE также выполняется в отдельном цикле, и решить эту проблему невозможно, поскольку EF не поддерживает пакетирование команд.

Создание хранимой процедуры и передача информации опродукт для этой хранимой процедуры.Хранимая процедура будет выполнять вставку или обновление в зависимости от наличия записи в базе данных.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...