2009-10-22 90 views

回答

22

有时你只需要混合模型。也许使用SqlBulkCopy作为你存储库的这一部分(因为它直接插入到大容量复制API中),其余部分使用实体框架。如果有必要的话,可以直接使用ADO.NET。最终目标是完成工作。

12

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

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

+0

哦不一 - 死链接 – 2015-05-06 05:04:01

+1

在这里找到... https://github.com /matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs – 2015-05-06 05:10:56

6

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

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

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; 
     } 
所有大容量数据的信息
3

您可以通过使用bulk insert extension

它使用SqlBulkCopy和自定义数据读取器来获得最佳性能。因此,它比使用常规插入或使用efbulkinsert延伸的AddRange

样品快20倍以上:

context.BulkInsert(hugeAmountOfEntities); 
+0

这是一个很棒的图书馆。我从零开始写了SqlBulkCopy的东西,但是这样更容易,更快捷 – Andrew 2017-04-11 11:13:02