C# Dapper - Restituisce l'identità inserita

C# Dapper - Restituisce l'identità inserita

Questo post descrive due modi per ottenere l'identità generata di una riga appena inserita. Useremo la tabella seguente tabella semplice con un Id colonna e un semplice Text colonna:

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

Useremo la seguente classe di corrispondenza per la tabella:

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

Una semplice istruzione di inserimento per questa tabella che utilizza dapper potrebbe essere simile a:

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

Utilizzando l'SQL standard possiamo aggiungere "output inserito.Id" alla nostra istruzione che "Restituisce informazioni da, o espressioni basate su, ogni riga interessata da un'istruzione INSERT, UPDATE, DELETE o MERGE":

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

Quanto sopra ci darà l'identità appena creata della riga all'interno di tale ambito. L'esempio prevede un int come identità, dovrai cambiarlo se usi un tipo di identità diverso per la tua tabella. Se usi Execute invece di QuerySingle ottieni il "numero di righe interessate" standard e non l'identità.

Utilizzo di Dapper.Contrib

In alternativa all'utilizzo di Dapper standard, puoi utilizzare il pacchetto nuget Dapper.Contrib, questo ti consente di semplificare le tue istruzioni di inserimento nel modo seguente:

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

Con Dapper Contrib non devi scrivere alcun SQL, lo creerà da solo. Ottenere l'identità è anche integrato nel metodo Insert, quindi non dovrai scrivere il tuo output per questo.

Questo è tutto

Spero che tu abbia trovato quello che stavi cercando, fammi sapere nei commenti qui sotto!