Realizar inserciones y actualizaciones con Dapper

Resuelto Slaggg asked hace 13 años • 9 respuestas

Estoy interesado en usar Dapper, pero por lo que puedo decir, solo admite Consulta y Ejecución. No veo que Dapper incluya una forma de Insertar y Actualizar objetos.

Dado que nuestro proyecto (¿la mayoría de los proyectos?) necesita realizar inserciones y actualizaciones, ¿cuál es la mejor práctica para realizar inserciones y actualizaciones junto con Dapper?

Preferiblemente no tendríamos que recurrir al método ADO.NET de creación de parámetros, etc.

La mejor respuesta que se me ocurre en este momento es usar LinqToSQL para inserciones y actualizaciones. ¿Existe una mejor respuesta?

Slaggg avatar May 11 '11 06:05 Slaggg
Aceptado

Estamos pensando en crear algunos asistentes, aún decidimos las API y si esto se incluye en el núcleo o no. Consulte: https://code.google.com/archive/p/dapper-dot-net/issues/6 para conocer el progreso.

Mientras tanto puedes hacer lo siguiente

val = "my value";
cnn.Execute("insert into Table(val) values (@val)", new {val});

cnn.Execute("update Table set val = @val where Id = @id", new {val, id = 1});

etcétera

Vea también la publicación de mi blog: Ese molesto problema de INSERTAR

Actualizar

Como se señaló en los comentarios, ahora hay varias extensiones disponibles en el proyecto Dapper.Contrib en forma de estos IDbConnectionmétodos de extensión:

T Get<T>(id);
IEnumerable<T> GetAll<T>();
int Insert<T>(T obj);
int Insert<T>(Enumerable<T> list);
bool Update<T>(T obj);
bool Update<T>(Enumerable<T> list);
bool Delete<T>(T obj);
bool Delete<T>(Enumerable<T> list);
bool DeleteAll<T>();
Sam Saffron avatar May 11 '2011 12:05 Sam Saffron

Realizar operaciones CRUD con Dapper es una tarea sencilla. He mencionado los siguientes ejemplos que deberían ayudarle en las operaciones CRUD.

Código para C RUD:

Método n.º 1: este método se utiliza cuando se insertan valores de diferentes entidades.

using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDbConnection"].ConnectionString))
{
    string insertQuery = @"INSERT INTO [dbo].[Customer]([FirstName], [LastName], [State], [City], [IsActive], [CreatedOn]) VALUES (@FirstName, @LastName, @State, @City, @IsActive, @CreatedOn)";

    var result = db.Execute(insertQuery, new
    {
        customerModel.FirstName,
        customerModel.LastName,
        StateModel.State,
        CityModel.City,
        isActive,
        CreatedOn = DateTime.Now
    });
}

Método n.º 2: este método se utiliza cuando las propiedades de su entidad tienen los mismos nombres que las columnas SQL. Entonces, Dapper, al ser un ORM, asigna propiedades de entidad con las columnas SQL coincidentes.

using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDbConnection"].ConnectionString))
{
    string insertQuery = @"INSERT INTO [dbo].[Customer]([FirstName], [LastName], [State], [City], [IsActive], [CreatedOn]) VALUES (@FirstName, @LastName, @State, @City, @IsActive, @CreatedOn)";

    var result = db.Execute(insertQuery, customerViewModel);
}

Código para C R UD:

using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDbConnection"].ConnectionString))
{
    string selectQuery = @"SELECT * FROM [dbo].[Customer] WHERE FirstName = @FirstName";

    var result = db.Query(selectQuery, new
    {
        customerModel.FirstName
    });
}

Código para CR U D:

using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDbConnection"].ConnectionString))
{
    string updateQuery = @"UPDATE [dbo].[Customer] SET IsActive = @IsActive WHERE FirstName = @FirstName AND LastName = @LastName";

    var result = db.Execute(updateQuery, new
    {
        isActive,
        customerModel.FirstName,
        customerModel.LastName
    });
}

Código para CRU D :

using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDbConnection"].ConnectionString))
{
    string deleteQuery = @"DELETE FROM [dbo].[Customer] WHERE FirstName = @FirstName AND LastName = @LastName";

    var result = db.Execute(deleteQuery, new
    {
        customerModel.FirstName,
        customerModel.LastName
    });
}
Reyan Chougle avatar Jul 03 '2016 08:07 Reyan Chougle

puedes hacerlo de tal manera:

sqlConnection.Open();

string sqlQuery = "INSERT INTO [dbo].[Customer]([FirstName],[LastName],[Address],[City]) VALUES (@FirstName,@LastName,@Address,@City)";
sqlConnection.Execute(sqlQuery,
    new
    {
        customerEntity.FirstName,
        customerEntity.LastName,
        customerEntity.Address,
        customerEntity.City
    });

Edición agregada por Cayo:

Tenga en cuenta que no es necesario abrir/cerrar la conexión de esta manera "inmediatamente antes/después de la operación": si su conexión está cerrada, Dapper la abre. Si su conexión está abierta, Dapper la deja abierta.

Abra la conexión usted mismo si, por ejemplo, tiene muchas operaciones que realizar o está utilizando una transacción. Deje que Dapper lo haga si todo lo que va a hacer es abrir/ejecutar/cerrar.

Además, no es necesario crear un tipo anónimo; simplemente haga que los nombres de sus parámetros coincidan con los nombres de sus propiedades en cualquier tipo que contenga sus datos y pase ese tipo en lugar de descomprimirlo en un tipo anónimo.

El código anterior se puede escribir así:

string sqlQuery = "INSERT INTO [dbo].[Customer]([FirstName],[LastName],[Address],[City]) VALUES (@FirstName,@LastName,@Address,@City)";

using(var sqlConnection = ...){
  sqlConnection.Execute(sqlQuery, customerEntity);

}
Dana Addler avatar Jul 05 '2011 07:07 Dana Addler

Usar Dapper.Contrib es tan simple como esto:

Insertar lista:

public int Insert(IEnumerable<YourClass> yourClass)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        return conn.Insert(yourClass) ;
    }
}

Insertar sencillo:

public int Insert(YourClass yourClass)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        return conn.Insert(yourClass) ;
    }
}

Lista de actualizacion:

public bool Update(IEnumerable<YourClass> yourClass)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        return conn.Update(yourClass) ;
    }
}

Actualización única:

public bool Update(YourClass yourClass)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        return conn.Update(yourClass) ;
    }
}

Fuente: https://github.com/StackExchange/Dapper/tree/master/Dapper.Contrib

Ogglas avatar Apr 24 '2017 20:04 Ogglas