2009-10-22 9 views

Respuesta

22

A veces simplemente tiene que mezclar modelos. Tal vez use SqlBulkCopy para esta parte de su repositorio (ya que esto se conecta directamente a la API de copiado masivo), y Entity Framework para algo del resto. Y si es necesario, un poco de ADO.NET directo. En definitiva, el objetivo es hacer el trabajo.

12

Para obtener un ejemplo perfecto de cómo hacer inserciones masivas con LINQ to Entities, consulte http://archive.msdn.microsoft.com/LinqEntityDataReader. Es un contenedor que permite el uso fácil de SqlBulkCopy.

@Marc Gravell es correcto, a veces hay que mezclar modelos para hacer el trabajo.

+0

oh no - vínculo roto –

+1

encontrado aquí ... https://github.com /matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs –

6

Escribí una clase que insertará a granel entidades EF (o cualquier tipo de objeto, siempre que los nombres de las propiedades coincidan con los nombres de las columnas).

La clase admite la personalización del tamaño de lote, pre & eventos de inserción de inserción, inserciones en cola y "modo firehose" (otorgarle mil millones de objetos, respetará el tamaño del lote).

2

Para insertar una enorme cantidad de datos en una base de datos, que utiliza para recopilar toda la información de la inserción en una lista y convertir esta lista en un DataTable. Luego inserto esa lista en una base de datos a través del SqlBulkCopy.

dónde envío mi lista generada
LiMyList
que contienen información de todos los datos a granel que quiero insertar a la base de datos
y pasarlo a mi operación de inserción mayor

InsertData(LiMyList, "MyTable"); 

Dónde InsertData es

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

Puede hacerlo usando bulk insert extension

Utiliza SqlBulkCopy y lector de datos personalizado para obtener el máximo rendimiento. Como resultado, es más de 20 veces más rápido que el uso regular o inserción AddRange

Muestra de utilizar la extensión efbulkinsert:

context.BulkInsert(hugeAmountOfEntities); 
+0

Esta es una impresionante biblioteca. He escrito cosas SqlBulkCopy desde cero antes, pero esto es mucho más fácil y rápido – Andrew

Cuestiones relacionadas