Je ne trouve aucun exemple sur la façon de réaliser une insertion en bloc / en lot avec Linq to Entities. Savez-vous comment faire un insert en vrac?
Réponses
Trop de publicités? Parfois, vous devez simplement mélanger des modèles. Utilisez peut-être SqlBulkCopy
pour cette partie de votre référentiel (car elle se branche directement dans l'API de copie en bloc) et Entity Framework pour une partie du reste. Et si nécessaire, un peu de direct ADO.NET. En fin de compte, l'objectif est de faire le travail.
Pour un exemple parfait de création d'insertions en bloc 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.
J'ai écrit une classe qui va bulk insert EF entités (ou tout type d'objet tant que la propriété le nom correspond au nom de colonne).
La classe prend en charge la personnalisation de la taille du lot, pré & post insérer des événements, des inserts en file d'attente, et "firehose mode" (donner un milliard d'objets, de respecter la taille du lot).
- Le code:
BulkInserter<T>
- Comment l'utiliser
Vous pouvez lire cet article et basé sur ce que vous pouvez faire des EF prend en charge de copie en bloc. Si vous êtes en utilisant le modèle d'abord en EF, cet article va être simple solution à votre cas. Si vous travaillez avec des classes POCO vous devrez modifier le IDataReader mise en Œuvre.
http://cgeers.com/2011/05/19/entity-framework-bulk-copy/
l'idée principale est de bulk insert directement les objets au lieu de les verser dans la table de données en premier.
Pour l'insertion d'une énorme quantité de données dans une base de données, j'ai utilisé pour recueillir tous les insérer des informations dans une liste et de les convertir cette liste en DataTable
. J'ai ensuite insérer cette liste à une base de données via SqlBulkCopy
.
Où j'ai envoyer ma liste générée LiMyList
qui contiennent des informations de toutes les données en vrac qui je veux insérer à la base de données
et de le passer à ma masse d'insertion de l'opération
InsertData(LiMyList, "MyTable");
Où 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;
}