2017-01-26 6 views
0

Я ищу способ вставки или обновления около 155 000 записей с использованием EF6. Стало очевидным, что EF6 выходит из строя, пытаясь найти запись и решить, является ли это вставкой или обновлением, созданием или обновлением объекта, а затем передать его в базу данных.Массовая вставка/обновление с EF6?

Оглядываясь, я видел сторонние приложения, такие как EntityFramework.Extend, но похоже, что они предназначены для массовых обновлений, таких как «Обновить таблицу, где Field = value», которая не совсем подходит для того, что я ищу. ,

В моем случае я читал в XML-документе, создавал список объектов из этого документа, а затем использовал EF для вставки или обновления в таблицу. Было бы лучше вернуться к обычному ADO.Net и использовать массовые вставки таким образом?

BTW: используется база данных Oracle, а не SQL Server.

ответ

0

Вы можете использовать EntityFramework.BulkInsert-ef6 пакет:

using EntityFramework.BulkInsert.Extensions; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var data = new List<Demo>(); 
     for (int i = 0; i < 1000000; i++) 
     { 
      data.Add(new Demo { InsertDate = DateTime.Now, Key = Guid.NewGuid(), Name = "Example " + i }); 
     } 
     Stopwatch sw = Stopwatch.StartNew(); 
     using (Model1 model = new Model1()) 
     { 
      sw.Start(); 
      model.BulkInsert(data); 
      sw.Stop(); 
     } 
     Console.WriteLine($"Elapsed time for {data.Count} rows: {sw.Elapsed}"); 
     Console.ReadKey(); 
    } 
} 

Запуск этого на моем локальном диске HDD дает

Elapsed time for 1000000 rows: 00:00:24.9646688

P.S. Поставщик пакета утверждает, что эта версия массового пакета устарела. Во всяком случае, это удовлетворяет мои потребности в течение многих лет, предлагаемый автором пакет больше не является бесплатным.

+0

Этот пакет не поддерживает Oracle, который требуется для этого вопроса. Да, этот пакет работает, даже если устарел с SQL Server, но не поддерживает все наследования и ассоциации.Вот почему я оставил последнюю версию на данный момент (я владелец пакета) –

0

Если вы ищете «бесплатный» способ сделать это, я рекомендую вам вернуться к ADO.NET и использовать привязки массивов, которые я делаю под капотом с моей библиотекой.

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

Эта библиотека поддержки всех основных поставщиков, включая Oracle

  • Oracle DevArt
  • Oracle DataAccess
  • Oracle DataAccessManaged

Эта библиотека позволяет выполнять все массовые операции, необходимые для сценариев:

  • Сыпучие SaveChanges
  • Bulk Вставьте
  • Bulk Удалить
  • Массовое обновление
  • Bulk Слияние

Пример

// Easy to use 
context.BulkSaveChanges(); 

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

// Perform Bulk Operations 
context.BulkDelete(customers); 
context.BulkInsert(customers); 
context.BulkUpdate(customers); 

// Customize Primary Key 
context.BulkMerge(customers, operation => { 
    operation.ColumnPrimaryKeyExpression = 
     customer => customer.Code; 
}); 

Эта библиотека позволит вам сэкономить массу времени, не имея необходимости создавать ADO.NET!

+1

Я тоже видел это расширение, но помнил, что в прошлом он не поддерживал Oracle, поэтому я упомянул, что использую его. К сожалению, мне придется вернуться к ADO.Net, потому что почти невозможно купить стороннее программное обеспечение, подобное этому. Я должен проскользнуть через обручи, чтобы получить первоначальное одобрение, а затем программное обеспечение должно пройти одобрение соответствия. Вероятно, понадобится минимум месяц, чтобы получить его и честно по цене, которую мне, вероятно, все равно откажут, но, по крайней мере, я получил ответ на возвращение в ADO.Net. Спасибо ... – Caverman

+0

Да, это печально, что иногда так сложно принести некоторые инструменты в компанию :(Я хорошо знаю это чувство и сложность, чтобы сделать такой запрос! Если вам нужна помощь с привязкой к массиву, не стесняйтесь спрашивать , –

Смежные вопросы