投稿者 SSD  (社会人) 投稿日時 2023/2/27 18:27:36
> こういう階層イメージでしょうか?
おおよそそんな感じです。
ただIdentityの値はあらかじめインスタンスで保持しているわけではなく、
テーブルにレコードをInsertした際にテーブル内のIdentityに設定している列に自動的に入ります。

提示いただいたSelectManyを用いる場合はそれぞれのクエリの実行の間に、
Insertした後に確定した各レコードのIndentityの値を取得するクエリの実行が必要になります。

αはコレクションではない単一のインスタンスで、
Insert文の実行をした後にSelect文の実行をしてIdentityの値を取得しています。

ただβとγはコレクションのコレクションというような関係で、
αと同じようなことをするとデータベースへの接続を何度も繰り返すことになり非効率なのかなと思い、
ストアドプロシージャの中でβのレコードを1行Insertし、@@IdentityでそのβのレコードのIdentityを取得した後にγ(XMLからテーブルに変換)のレコードを複数行Insertしている感じです。

> 一括挿入なら、Dapper Plus で Bulk Insert するという手がありますね。
Executeとの処理速度の比較表を見るととてつもなく速いですね
https://dapper-plus.net/bulk-insert
ただお値段が結構しますね..

Bulk Insertの場合であっても1:nの関係で、親のIdentityの値を子のレコードに入れる場合、
・親のレコードをInsert
・確定した親レコードのIdentityを取得
・親のIdentityの値を加えて子のレコードをInsert
を繰り返すことになりInsertとIdentityの取得で接続と切断が繰り返されてしまい、パフォーマンスが悪いのかなと思ってあまり考慮していませんでした

Identityを用いてこのようにリレーショナルにすること自体がそもそもおかしいんでしょうか?