我找不到任何关于如何使用Linq to Entities进行批量/批量插入的示例。你们知道如何进行批量插入吗?
答案 0 :(得分:22)
有时您只需要混合模型。也许对存储库的这一部分使用SqlBulkCopy
(因为这会直接插入批量复制API),其余部分则使用Entity Framework。如有必要,可以直接使用ADO.NET。最终目标是完成工作。
答案 1 :(得分:12)
有关如何使用LINQ to Entities进行批量插入的完美示例,请参阅http://archive.msdn.microsoft.com/LinqEntityDataReader。它是一个允许轻松使用SqlBulkCopy的包装器。
@Marc Gravell是正确的,有时您必须混合模型才能完成工作。
答案 2 :(得分:6)
我写了一个类,它将批量插入EF实体(或任何类型的对象,只要属性名称与列名匹配)。
该类支持自定义批量大小,pre&插入事件,排队插入和“firehose模式”(给它十亿个对象,它将尊重批量大小)。
答案 3 :(得分:3)
它使用SqlBulkCopy和自定义datareader来获得最大性能。因此,它比使用常规插入或AddRange
快20多倍使用efbulkinsert扩展的示例:
context.BulkInsert(hugeAmountOfEntities);
答案 4 :(得分:2)
为了在数据库中插入大量数据,我曾经将所有插入信息收集到列表中,并将此列表转换为DataTable
。然后,我通过SqlBulkCopy
将该列表插入数据库。
我发送生成的列表的LiMyList
,其中包含我要插入数据库的所有批量数据的信息,并将其传递给我的批量插入操作
InsertData(LiMyList, "MyTable");
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;
}