C# Dapper – Gibt die eingefügte Identität zurück

C# Dapper – Gibt die eingefügte Identität zurück

Dieser Beitrag beschreibt zwei Möglichkeiten, um die generierte Identität einer neu eingefügten Zeile zu erhalten. Wir werden die folgende einfache Tabelle mit einem Id verwenden Spalte und eine einfache Text Spalte:

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

Wir werden die folgende Matching-Klasse für die Tabelle verwenden:

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

Eine einfache Einfügeanweisung für diese Tabelle mit Dapper könnte wie folgt aussehen:

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" });
}

Unter Verwendung von Standard-SQL können wir "output inserted.Id" zu unserer Anweisung hinzufügen, die "Informationen oder Ausdrücke basierend auf jeder Zeile zurückgibt, die von einer INSERT-, UPDATE-, DELETE- oder MERGE-Anweisung betroffen ist":

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" });
}

Das Obige gibt uns die neu erstellte Identität der Zeile innerhalb dieses Bereichs. Das Beispiel erwartet ein int als Identität, Sie müssen dies ändern, wenn Sie einen anderen Identitätstyp für Ihre Tabelle verwenden. Wenn Sie Execute verwenden statt QuerySingle Sie erhalten die standardmäßige "Anzahl der betroffenen Zeilen" und nicht die Identität.

Dapper.Contrib verwenden

Alternativ zur Verwendung von Standard-Dapper können Sie das Nuget-Paket Dapper.Contrib verwenden, mit dem Sie Ihre Einfügeanweisungen auf folgende Weise vereinfachen können:

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" });
}

Mit Dapper Contrib müssen Sie kein SQL schreiben, es erstellt es von selbst. Das Abrufen der Identität ist auch in die Insert-Methode integriert, sodass Sie dafür keine eigene Ausgabe schreiben müssen.

Das ist alles

Ich hoffe, Sie haben gefunden, wonach Sie gesucht haben. Lassen Sie es mich in den Kommentaren unten wissen!