2015-05-20 3 views
1

У нас есть задача вставить около 5000 записей в таблицу SQL. Первоначально мы прошли через EF и здесь пример кодаКакой я должен выбрать Entity Framework или ADO.Net?

foreach (var BCol in batchCollectionoutput1) 
{ 
    var context1 = new TestENTITIES.TestDbContext(); 
    context1.Database.CommandTimeout = 6000; 
    context1.Configuration.AutoDetectChangesEnabled = false; 
    context1.Configuration.ValidateOnSaveEnabled = false; 

    foreach (TestENTITIES.Output1 test in BCol) 
    context1.Output1.Add(test); 

    context1.SaveChanges(); 
    } 

это занимает 43412 миллисекунд

, после чего мы хотели, чтобы проверить с помощью SQL Bulk метода

using (SqlConnection sourceConnection = new SqlConnection(srcConnectionString)) 
{ 
    SqlCommand myCommand1 = new SqlCommand("SELECT TOP 1000 * FROM input", sourceConnection); 

     sourceConnection.Open(); 
     SqlDataReader reader1 = myCommand1.ExecuteReader(); 

     using (SqlConnection destinationConnection = new SqlConnection(destConnectionString)) 
     { 
      destinationConnection.Open(); 

      using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection.ConnectionString)) 
      { 
      bulkCopy.BatchSize = 500; 
      bulkCopy.NotifyAfter = 1000; 
      bulkCopy.DestinationTableName = "Output1"; 
      bulkCopy.WriteToServer(reader1); 

      } 

    reader1.Close(); 

       } 
      } 

копии, которая принимает только 1124 миллисекунд ..

что-то, что мы делаем неправильно в методе структуры Entity? Просьба сообщить

+5

Вы можете поместить 'context1.SaveChanges()' после цикла 'foreach'. –

+0

Как и ожидалось, EF не предназначен для обработки массовых операций. Однако есть расширения, которые вы можете установить, которые обрабатывают его: https://efbulkinsert.codeplex.com/ – Magnus

ответ

2

Нет - вы ожидали бы, что EF будет медленнее, чем BulkInsert.

EF больше подходит для сценариев, в которых вы хотите получать данные из своей БД, отображать результаты в POCO, применять некоторые изменения и затем сохранять их. Реальная выгода заключается в том, что он не агностик базы данных, и разработчику не нужно беспокоиться о сантехнике создания соединений с базой данных, командах и т. Д.

Где вы хотите загрузить данные из файла импорта или аналогичной массовой копии, безусловно, является чтобы перейти с точки зрения производительности.

0

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

Есть три способа сделать это:

  1. Run каждая строка вставки в своей собственной транзакции и туда и обратно к базе данных. Очень медленно.

  2. Запустите каждую вставку строк, собранную в одну транзакцию и базу данных в оба конца.

  3. Сделать копию навалом. Очень быстро.

Ваш код EF делает 1. Вы могли бы сделать 2, перемещая SaveChanges вне цикла. Вы не можете делать 3. с EF, но вы не можете делать 3. с «просто» обычной техникой ADO.NET либо (с помощью только команд SQL) - для этого вам нужен специальный объект (SqlBulkCopy).

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