2009-10-22 12 views

risposta

22

A volte devi semplicemente mescolare i modelli. È possibile utilizzare SqlBulkCopy per questa parte del repository (poiché si collega direttamente all'API di copia bulk) e Entity Framework per il resto. E se necessario, un po 'di ADO.NET diretto. In definitiva, l'obiettivo è portare a termine il lavoro.

12

Per un esempio perfetto di come eseguire inserimenti di massa con LINQ alle entità, vedere http://archive.msdn.microsoft.com/LinqEntityDataReader. È un wrapper che consente un facile utilizzo di SqlBulkCopy.

@Marc Gravell è corretto, a volte devi mescolare i modelli per portare a termine il lavoro.

+0

oh noes - link morto –

+1

trovato qui ... https://github.com /matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs –

6

Ho scritto una classe che inserirà in massa le entità EF (o qualsiasi tipo di oggetto purché i nomi delle proprietà corrispondano ai nomi delle colonne).

La classe supporta la personalizzazione della dimensione del batch, gli eventi di inserimento post &, gli inserimenti in coda e la "modalità firehose" (assegnando un miliardo di oggetti, rispetterà la dimensione del batch).

2

Per l'inserimento di una quantità enorme di dati in un database, che ho usato per raccogliere tutte le informazioni inserendo in una lista e convertire questa lista in una DataTable. Quindi inserisco l'elenco in un database tramite SqlBulkCopy.

Dove mando la mia lista generata
LiMyList
che contengono le informazioni di tutti i dati di massa, che voglio inserire nel database
e passarlo al mio grosso operazione di inserimento

InsertData(LiMyList, "MyTable"); 

Dove InsertData è

public static void InsertData<T>(List<T> list,string TabelName) 
     { 
       DataTable dt = new DataTable("MyTable"); 
       clsBulkOperation blk = new clsBulkOperation(); 
       dt = ConvertToDataTable(list); 
       ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); 
       using (SqlBulkCopy bulkcopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["SchoolSoulDataEntitiesForReport"].ConnectionString)) 
       { 
        bulkcopy.BulkCopyTimeout = 660; 
        bulkcopy.DestinationTableName = TabelName; 
        bulkcopy.WriteToServer(dt); 
       } 
     }  

public static DataTable ConvertToDataTable<T>(IList<T> data) 
     { 
      PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T)); 
      DataTable table = new DataTable(); 
      foreach (PropertyDescriptor prop in properties) 
       table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); 
      foreach (T item in data) 
      { 
       DataRow row = table.NewRow(); 
       foreach (PropertyDescriptor prop in properties) 
        row[prop.Name] = prop.GetValue(item) ?? DBNull.Value; 
       table.Rows.Add(row); 
      } 
      return table; 
     } 
3

È possibile farlo utilizzando bulk insert extension

Utilizza SqlBulkCopy e datareader personalizzato per ottenere prestazioni massime. Di conseguenza, è più di 20 volte più veloce rispetto all'utilizzo di inserimento regolare o AddRange

Esempio di utilizzo di estensione efbulkinsert:

context.BulkInsert(hugeAmountOfEntities); 
+0

Questa è una libreria fantastica. Ho già scritto da zero SqlBulkCopy, ma è molto più semplice e veloce – Andrew

Problemi correlati