C# Dapper - Devuelve la identidad insertada

C# Dapper - Devuelve la identidad insertada

Esta publicación describe dos formas de obtener la identidad generada de una fila recién insertada. Usaremos la siguiente tabla tabla simple con un Id columna y un simple Text columna:

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

Usaremos la siguiente clase coincidente para la tabla:

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

Una declaración de inserción simple para esta tabla usando dapper podría verse así:

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

Usando SQL estándar, podemos agregar "salida insertada.Id" a nuestra declaración que "Devuelve información de, o expresiones basadas en, cada fila afectada por una declaración 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" });
}

Lo anterior nos dará la identidad recién creada de la fila dentro de ese ámbito. El ejemplo espera un int como identidad, tendrá que cambiar esto si usa un tipo de identidad diferente para su tabla. Si usa Execute en lugar de QuerySingle obtienes el "número de filas afectadas" estándar y no la identidad.

Usando Dapper.Contrib

Alternativamente al uso de Dapper estándar, puede usar el paquete nuget Dapper.Contrib, esto le permite simplificar sus declaraciones de inserción de la siguiente manera:

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 no tiene que escribir ningún SQL, lo creará por sí solo. Obtener la identidad también está integrado en el método Insertar, por lo que no tendrá que escribir su propia salida para esto.

Eso es todo

Espero que hayas encontrado lo que estabas buscando, ¡házmelo saber en los comentarios a continuación!