2016-04-19 19 views

答えて

3

エンティティフレームワークに一括挿入のサポートはありません。 数千のオブジェクトを単にDbSetに追加してから、SaveChangesを呼び出すと、パフォーマンスが大幅に低下します。

using(var db = new Db()) 
{ 
    foreach(var item from data) 
    { 
     db.Items.Add(item); 
    } 
    db.SaveChanges(); 
} 

EFは大きなメモリ使用量と高い計算となり、すべてのオブジェクトのすべての変更を追跡するので、それは起こります。

EFのバージョンとアプローチによっては、変更の追跡を無効にしたり、ケースのサイズや実際のパフォーマンスに応じて、100または1000アイテムの比較的小さな部分でオブジェクトを挿入することができます。変更を一度計算して保存します。例えば。

int count = 100; 
using (var db = new BloggingContext()) 
{ 
    data.Configuration.AutoDetectChangesEnabled = false; 
    foreach (var item in data) 
    { 
     db.Items.Add(item); 
     --count; 
     if(count <= 0) 
     { 
      count = 100; 
      db.SaveChanges(); 
     } 
    } 
    db.SaveChanges(); // To make sure we save everything if the last part was smaller than 100 
} 

また、バルク挿入をサポートするライブラリはほとんどありません。たとえば:https://github.com/loresoft/EntityFramework.Extendedヤロスラフがコメントしたよう

+0

EntityFramework.E xtendedは一括挿入をサポートしていません。 –

+1

@JonathanMagnanはいそうです...更新と削除のみです。私はそれを忘れてしまった。 –

2

は、Entity Frameworkのチームからの一括挿入への直接支援、

しかし3つのライブラリがそれをサポートはありません。

あなたは3つのライブラリについて話小さな記事を見つけることができます:Entity Framework - Bulk Insert

例:

using (var ctx = new EntitiesContext()) 
{ 
    // Do not use the ChangeTracker or require to add the list in the DbSet 
    ctx.BulkInsert(list); 
} 

免責事項:私はプロジェクトのオーナーですEntity Framework Extensions

関連する問題