2009-10-22 20 views

答えて

22

モデルを混在させるだけの場合もあります。おそらく、リポジトリのこの部分にSqlBulkCopyを使用してください(これはバルクコピーAPIに直接接続されるため)。残りの部分はEntity Frameworkを使用します。必要に応じて、直接ADO.NETのビット。最終的には目標を達成することです。

12

LINQ to Entitiesで一括挿入する方法の完全な例は、http://archive.msdn.microsoft.com/LinqEntityDataReaderを参照してください。 SqlBulkCopyを簡単に使用できるラッパーです。

@Marc Gravellは正しいですが、仕事を完了させるためにモデルをミックスする必要があることがあります。

+0

ああのNOE - ここでそれを見つけた死者リンク –

+1

を... https://github.com /matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs –

6

EFエンティティ(またはプロパティ名が列名と一致する限り、あらゆる種類のオブジェクト)を一括して挿入するクラスを作成しました。

クラスは、バッチサイズのカスタマイズ、プレ後挿入イベント、キューインサート、および「Firehoseモード」(バッチサイズを考慮して10億個のオブジェクトを与える)をサポートしています。

2

データベースに大量のデータを挿入するためには、私は、リスト内のすべての挿入情報を収集し、DataTableにこのリストを変換するために使用されます。私はSqlBulkCopy経由でデータベースにそのリストを挿入します。私は生成されたリストを送って

私はデータベース
に挿入し、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; 
     } 
である私の一括挿入操作

InsertData(LiMyList, "MyTable"); 

にそれを渡したいすべてのバルクデータの情報が含まれてい
LiMyList

3

bulk insert extension

SqlBulkCopyとカスタムデータウェアハウスを使用してパフォーマンスを最大限に引き出します。その結果、それは通常の挿入またはefbulkinsert延長使用のAddRange

サンプル使用するよりも20倍以上高速である:

context.BulkInsert(hugeAmountOfEntities); 
+0

これはすばらしいライブラリです。私は前からSqlBulkCopyのものを書きましたが、これははるかに簡単で迅速です – Andrew