2016-06-30 2 views
2

私はDapperの使用をまだ開始していませんが、バルクの挿入/更新について研究していた今日、それはすぐに遭遇しました。現在私はEF6を使用していますが、私は大量のものの将来Dapperを使用してみたいと思います。このアプリのために〜15kのレコードがあるかもしれませんが、私は〜100kレコードになる可能性のある他のアプリを持っています。大まかな挿入または更新ですか?

私は次のEFコードをDapperに変換する方法を研究しようとしています。それはファイルからレコードを読み込み、その従業員がDBに存在するかどうかを調べ、そうであればファイルの値でプロパティを更新し、そうでない場合はファイルからの値で新しいオブジェクトを作成します。

私が探しているときに例が見つかりませんでした。私が見つけることができるのは、単純な挿入や更新を行う方法でした。私は実際に一括挿入/更新の良い例は見つけられませんでした。 Dapperをどうやって使うのか分かりません。

Dapperでどうすればいいですか?

int count = 1; 
using (ctx = new DataContext()) 
{ 
    ctx.Configuration.AutoDetectChangesEnabled = false;  
    ctx.Configuration.ValidateOnSaveEnabled = false; 

    while ((record = srFile.ReadLine()) != null) 
    { 
     int employeeId = int.Parse(record.Substring(2, 8)); 

     bio_employee employee = ctx.bio_employee.FirstOrDefault(e => e.emp_id == employeeId); 

     if (employee != null) 
     { 
      SetEmployeeData(employee, record); 

      ctx.Entry(employee).State = System.Data.Entity.EntityState.Modified; 
     } 
     else 
     { 
      employee = new bio_employee(); 
      employee.emp_id = employeeId; 

      SetEmployeeData(employee, record); 

      ctx.bio_employee.Add(employee); 
     } 


     if (count % batchSize == 0) 
     { 
      ctx.SaveChanges(); 
      ctx.Dispose(); 
      ctx = new DataContext(); 
     } 

     count++; 
    } 
    ctx.SaveChanges();  //save any remaining 
} 
+0

私はここに2つの異なることがあると思います:a)TSQLでupsertを行う方法。 b)TSQLをdapperから呼び出す方法。後者は非常に簡単です - トリッキーなビットは前者ですが、それは大胆な懸念ではなく、TSQLです。グーグル "upsert SQL Server"を試してください –

答えて

5

Dapperは、データをクエリする複数の方法を提供しますが、通常はORMなしで行うようなコマンド以外の保存操作は実行しません。

しかし、サードパーティのライブラリーカバーDapperのために、このシナリオの多く:

免責事項:BulkInsert、bulkdeleteの、BulkUpdate、およびBulkMerge操作を:私はプロジェクトDapper Plus

Dapperのプラスの持ち主だが、これまでで提供することにより、最速のライブラリです。数百万のレコードを持つシナリオを簡単にサポートできます。

// CONFIGURE & MAP entity 
DapperPlusManager.Entity<Employee>() 
       .Table("Employee") 
       .Identity(x => x.EmployeeID); 

// SAVE entity 
connection.BulkMerge(employeeList); 

EDIT:回答設問

はあなたのDapperPlusで.BulkMergeはい、BulkMergeがアップサート操作でアップサート

を行っています。

マッピングキーを使用して、同じエンティティに複数のマッピングを指定することもできます。

// Using key from database (x => x.EmployeeID) 
DapperPlusManager.Entity<Employee>() 
       .Table("Employee"); 

connection.BulkInsert(employees); 

// Using custom key 
DapperPlusManager.Entity<Employee>("customKey") 
       .Table("Employee") 
       .Key(x => x.Code); 

connection.BulkInsert("customKey", employees); 
+0

クール、私は見てみましょう。 DapperPlusの.BulkMergeがUpsertをやっていますか?だから私は従業員のリストを渡すことができ、それはそれらを更新するか、または新しいものを挿入するでしょうか? – Caverman

+0

私の現在のプロジェクトはSQLで起こっていますが、私の仕事の大部分はOracleです。あなたのサイトは、Oracleがまもなく公開されることを示していますその部分のETAは何ですか? – Caverman

+0

今月末までについにそれをサポートできることを願っています。数週間前にクエリを最適化するために必要なすべての調査を完了しました。 –

関連する問題