2009-10-22 5 views

Répondre

22

Il suffit parfois de mélanger des modèles. Peut-être utiliser SqlBulkCopy pour cette partie de votre dépôt (puisque cela se branche directement dans l'API de copie en bloc), et Entity Framework pour certains des autres. Et si nécessaire, un peu d'ADO.NET direct. En fin de compte, l'objectif est de faire le travail.

12

Pour un exemple parfait de la procédure à suivre pour les insertions groupées avec LINQ to Entities, voir http://archive.msdn.microsoft.com/LinqEntityDataReader. C'est un wrapper qui permet une utilisation facile de SqlBulkCopy.

@Marc Gravell a raison, il faut parfois mélanger des modèles pour faire le travail.

+0

oh NoE - lien mort –

+1

trouvé ici ... https://github.com /matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs –

6

J'ai écrit une classe qui insérera en bloc des entités EF (ou n'importe quel type d'objet tant que les noms de propriété correspondent aux noms de colonnes).

La classe prend en charge la personnalisation de la taille du lot, & après les événements d'insertion, les insertions en file d'attente et le mode «firehose» (donnez-lui un milliard d'objets, elle respecte la taille du lot).

2

Pour insérer une énorme quantité de données dans une base de données, j'ai utilisé pour collecter toutes les informations à insérer dans une liste et convertir cette liste en une DataTable. Je puis insérer cette liste à une base de données via SqlBulkCopy.

Où j'envoyer ma liste générée
LiMyList
qui contiennent des informations de toutes les données en vrac que je veux insérer à la base de données
et le transmettre à mon opération d'insertion en vrac

InsertData(LiMyList, "MyTable"); 

InsertData est

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

Vous pouvez le faire en utilisant bulk insert extension

Il utilise SqlBulkCopy et le lecteur de données personnalisé pour obtenir des performances maximales. Par conséquent, il est plus de 20 fois plus rapide que l'utilisation régulière d'insertion ou AddRange

Exemple d'utilisation efbulkinsert l'extension:

context.BulkInsert(hugeAmountOfEntities); 
+0

Ceci est une bibliothèque impressionnante. J'ai déjà écrit des trucs sur SqlBulkCopy mais c'est tellement plus simple et rapide – Andrew