C# Dapper - 挿入された ID を返す

この投稿では、新しく挿入された行の生成された ID を取得する 2 つの方法について説明します。 Id を持つ次の表の単純な表を使用します 列と単純な Text 列:

CREATE TABLE [dbo].[MyEntities](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[Text] [nvarchar](max) NOT NULL,
   CONSTRAINT [PK_MyEntities] PRIMARY KEY CLUSTERED 
   (
	  [Id] ASC
   )
)

テーブルには次のマッチング クラスを使用します:

[Table("MyEntities")]
public class MyEntity
{
    public int Id { get; set; }
    public string Text { get; set; }
}

dapper を使用したこのテーブルの単純な挿入ステートメントは、次のようになります。

using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
    var identity = sqlConnection.QuerySingle<int>("INSERT INTO [dbo].[MyEntities] (Text) VALUES (@Text);"
        , new MyEntity { Text = "this is a text" });
}

標準 SQL を使用して、「INSERT、UPDATE、DELETE、または MERGE ステートメントの影響を受ける各行からの情報、またはそれに基づく式を返す」ステートメントに「output insert.Id」を追加できます。

using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
    var identity = sqlConnection.QuerySingle<int>("INSERT INTO [dbo].[MyEntities] (Text) output inserted.Id VALUES (@Text);"
        , new MyEntity { Text = "this is a text" });
}

上記により、そのスコープ内の行の新しく作成された ID が得られます。この例では、ID として int が想定されています。テーブルに別の ID タイプを使用する場合は、これを変更する必要があります。 Execute を使用する場合 QuerySingle の代わりに ID ではなく、標準の「影響を受ける行数」を取得します。

Dapper.Contrib の使用

標準の Dapper を使用する代わりに、Dapper.Contrib nuget パッケージを使用できます。これにより、次の方法で挿入ステートメントを簡素化できます。

using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
    var identity = sqlConnection.Insert(new MyEntity { Text = "this is a text" });
}

Dapper Contrib を使用すると、SQL を記述する必要がなく、独自に作成されます。 ID の取得も Insert メソッドに組み込まれているため、独自の出力を記述する必要はありません。

それだけです

探していたものが見つかったことを願っています。下のコメント欄でお知らせください!