redwarrior’s diary

C#, ASP.NET, WEB, G*などの雑多な情報

Entity Framework CoreのInsert高速化 & InsertOrUpdateを行うライブラリ

数万件単位のレコードを登録するバッチアプリケーションを作成することになった。

公開されているWeb APIからデータを取得して、かなり編集をしてから登録するため、ストアドプロシージャは適していないし、生のSQLでやるのもミスが多そうなので避けたい。となると、Entity Frameworkを使うことになる。最新は Entity Framework Coreという名前になっているので、こちらを使った。

登録用データの作成までは良かったが、実際に動かしてみると、それなりに時間がかかった。スケジューラーに組み込んでいる他の処理との関係で、登録にかかる時間は短ければ短いほど良いので、大きく変えずに高速化する方法を調べると、公式サイトに以下のページがあった。

docs.microsoft.com

github.com

ここで紹介されているライブラリ「EFCore.BulkExtensions」を導入すると、Insert高速化 & InsertOrUpdateが出来るようになった。具体的な記録は取っていないけど10万レコードで試した所、確かに速くなっているように感じた。InsertOrUpdate機能も要件にマッチしていたので、これを採用することにした。

サイトの方に使い方がのっているが、簡単なサンプルを残しておく。削除は要件になかったので、使用せず。

// EntityクラスBookを作成(POCO)
Book book = new Book {
    // プロパティを設定
}

// Insert Or Update処理。SQLのMERGE文が呼び出される
// contextは、Entity Frameworkで作成したDbContextのサブクラス
// 1レコードでもリストを作成する
context.BulkInsertOrUpdate(new List<Book> { book });

実際に使用した時は、リストに全て含めると、内1件でエラーが発生した時にどこでエラーになったかがSQLを見てもわからないため、数件ずつのリストに分割して呼び出すようにした。

以上