Realizar inserciones y actualizaciones con Dapper
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?
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 IDbConnection
mé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>();
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
});
}
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);
}
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