Dapper es un micro ORM (Object Relational Mapper) desarrollado por el equipo de Stack Overflow.
A diferencia de Entity Framework, no crea un modelo complejo ni gestiona el cambio de esquema, sino que se enfoca en mapear rápidamente el resultado de consultas SQL a objetos C#.
Su gran ventaja es el rendimiento: es casi tan rápido como usar SqlDataReader
directamente, pero con una sintaxis mucho más simple.
Ventajas:
- Rápido y ligero: muy cercano al rendimiento de ADO.NET puro.
- Sencillo de usar: no necesita configuración compleja.
- Compatible con cualquier base de datos que tenga un proveedor ADO.NET.
- Mapeo directo de resultados a clases.
Desventajas:
- No gestiona el modelo ni migraciones (a diferencia de EF Core).
- Necesita escribir consultas SQL manualmente.
- Menos seguro si no usas parámetros (riesgo de inyección SQL).
Ejemplo de instalación y uso:
1. Instalación
Crea un proyecto nuevo y agrega los paquetes:
dotnet new console -n DapperPostgresDemo cd DapperPostgresDemo dotnet add package Dapper dotnet add package Npgsql
Aquí usamos Npgsql porque es el proveedor ADO.NET para PostgreSQL.
2. Base de datos de ejemplo
En PostgreSQL, crea una tabla:
CREATE TABLE empleados ( id SERIAL PRIMARY KEY, nombre VARCHAR(100), cargo VARCHAR(50), salario NUMERIC(10,2) ); INSERT INTO empleados (nombre, cargo, salario) VALUES ('Ana López', 'Desarrolladora', 2500), ('Carlos Pérez', 'Diseñador', 2000);
3. Código en C# con Dapper y PostgreSQL
using System; using System.Data; using Npgsql; using Dapper; class Program { static void Main() { string connectionString = "Host=localhost;Database=miempresa;Username=postgres;Password=TuPassword"; using IDbConnection db = new NpgsqlConnection(connectionString); // Consulta simple var empleados = db.Query<Empleado>("SELECT * FROM empleados"); Console.WriteLine("Lista de empleados:"); foreach (var emp in empleados) { Console.WriteLine($"{emp.Id} - {emp.Nombre} ({emp.Cargo}) - {emp.Salario:C}"); } // Insertar con parámetros string insertSql = "INSERT INTO empleados (nombre, cargo, salario) VALUES (@Nombre, @Cargo, @Salario)"; var nuevoEmpleado = new Empleado { Nombre = "María Torres", Cargo = "QA", Salario = 1800 }; db.Execute(insertSql, nuevoEmpleado); Console.WriteLine("Empleado insertado correctamente."); } } // Clase que mapea la tabla public class Empleado { public int Id { get; set; } public string Nombre { get; set; } public string Cargo { get; set; } public decimal Salario { get; set; } }
En Resumen
NpgsqlConnection
es la clase para conectar a PostgreSQL.
Query<T>
devuelve una lista de objetos mapeados desde el resultado de la consulta.
Execute
se usa para sentencias INSERT
, UPDATE
, DELETE
.
Parámetros como @Nombre
evitan inyección SQL.
Puedes usar using
para cerrar automáticamente la conexión.