2012-03-30 4 views
0

このように、(現在)約15k製品をインポートする必要があります。各製品には20個のプロパティーがあり、他の表に属する情報(この製品に使用されている倉庫など)もあります。同じ情報をたくさん保存するのを避けるために、私はアドレス、名前、およびIDを含むWarehouse-tableを作成しました。名前と住所は、私が実行したインポートに記載されています。EFで多くの相互接続されたデータをインポートする

データベースに既に存在する場合と存在しない場合がある、製品に関連する他の関連するデータがあります。

私は現在、これを行う方法は、私は彼らに来るよう、関連するエントリが存在し、そうでない場合、私は別のコンテキストを使用してデータベースに追加し、新しく生成されたエンティティのIDを返すかどうかをチェックすることです。実際の製品は、「メイン」コンテキストに追加され、すべてが追加された後に保存されます。

using (var context = new MyContext()) 
{ 
    foreach (var product in productList) 
    { 
     CheckWarehouse(product); 
     CreateEntityFromProduct(product); 
    } 
    context.SaveChanges(); 
} 

これはある程度データの電流量で動作んが、それはまだかなり遅いですので、私はこれについて移動する良い方法であるもの、思ったんだけど?:このような何か

+0

並列実行できません。 – Eranga

+0

'CheckWarehouse'と 'CreateEntityFromProduct'のコードはありますか? – Silvermind

答えて

1

Linqは大量のデータではあまり良くありません。一括挿入ができます。大量のデータをサポートする提案があります。

void Main() 
{ 
    //Your list of objects 
    List<MyObject> TheListOfMyObjects=new List<MyObject>(); 

    var dt=new DataTable(); 
    dt.Columns.Add("Prop1",typeof(int)); 
    dt.Columns.Add("Prop2",typeof(string)); 
    foreach (var TheObject in TheListOfMyObjects) 
    { 
     dt.Rows.Add(TheObject.Prop1,TheObject.Prop2); 
    } 
    InsertWithBulk(dt,"YourConnnectionString","MyObject"); 
} 
private void InsertWithBulk(DataTable dt,string connectionString,string tableName) 
{ 
    using (SqlConnection destinationConnection =new SqlConnection(connectionString)) 
    { 
     destinationConnection.Open(); 
     using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection)) 
     { 
      bulkCopy.DestinationTableName =tableName; 

      try 
      { 
       bulkCopy.WriteToServer(dt); 
      } 
      catch (Exception ex) 
      { 
       //Exception from the bulk copy 
      } 
     } 
    } 
} 
+0

@bobblez:答えが良いと思うなら、upvoteを忘れないでください。答えは "相互に関係する"部分をカバーしていませんが、それは私たちに暖かく曖昧な気持ちを与えます。 – Arion

+0

しかし、私は、外来キーを持たないテーブルから始めて、複数の挿入を行うだけで、より依存性の高いものに向かって作業すると思います。ただし、DestinationTableName-propertyを変更するだけで、異なるテーブルへの複数のバッチインサートに対して1つのSqlBulkCopy-instanceを使用できますか?または毎回新しいインスタンスを作成する必要がありますか? – bobblez

+0

あなたはテーブルごとにそれを行う必要があります。 – Arion

関連する問題