如何做批量插入 – Linq的实体

我找不到任何有关如何使用Linq to Entities进行批量/批量插入的示例。 你们知道如何做批量插入吗?

有时你只需要混合模型。 也许使用SqlBulkCopy作为你的仓库的这一部分(因为这直接插入到大容量复制API),其余的一些entity framework。 如果需要的话,直接ADO.NET。 最终目标是完成工作。

有关如何使用LINQ to Entities进行批量插入的完美示例,请参阅http://archive.msdn.microsoft.com/LinqEntityDataReader 。 这是一个包装,可以方便地使用SqlBulkCopy。

@Marc Gravell是正确的,有时你必须混合模型才能完成工作。

我写了一个类,它将批量插入EF实体(或任何种类的对象,只要属性名称与列名匹配)。

该类支持自定义批量大小,预插入事件和后插入事件,排队插入和“stream水模式”(给它十亿个对象,它将尊重批量大小)。

  • 代码: BulkInserter<T>
  • 如何使用它

您可以通过使用批量插入扩展来完成

它使用SqlBulkCopy和自定义数据读取器来获得最大的性能。 因此,它比使用常规插入或AddRange快20多倍

使用efbulkinsert扩展的示例:

 context.BulkInsert(hugeAmountOfEntities); 

为了在数据库中插入大量的数据,我使用收集所有的插入信息到一个列表中,并把这个列表转换成一个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; }