Una librería liviana y extensible de acceso a datos en C# basada en Dapper, diseñada para trabajar con múltiples motores de base de datos como SQL Server y Sybase. Incluye soporte para Unit of Work, ejecución de SQL, procedimientos almacenados, multi-mapping, metadatos de entidades y más.
- ✅ Soporte multi-DB con
IDbConnectionFactoryy alias - ✅ Ejecución de SQL interpolado (
FromSqlInterpolated) - ✅ Multi-mapping con Dapper (
FromSqlMultiMap) - ✅ Soporte para transacciones (
UnitOfWork) - ✅ Repositorio genérico (
GenericRepository<T>) - ✅ Lectura de metadatos vía atributos ([Key], [Column], [Required], etc.)
- ✅ Extensible con SPs (
StoredProcedureExecutor) - ✅ Preparado para integración con
ModelBuilderfuturo
Agrega el proyecto como referencia en tu solución o compílalo como paquete NuGet.
//Simple conexión, a una base de datos
builder.Services.AddDataToolkitSqlServer(
"Server=localhost;Database=pruebasdb;User Id=sqluser;Password=contrasena123;" +
"Pooling=true;Min Pool Size=3;Max Pool Size=30;" +
"Connection Timeout=15;APP=LIB;Language=us_english;" +
"Encrypt=True;TrustServerCertificate=True;"
);
//Una conexión
builder.Services.AddDataToolkitSqlServer(
"Server=localhost;Database=pruebasdb;User Id=sqluser;Password=contrasena123;" +
"Pooling=true;Min Pool Size=3;Max Pool Size=30;" +
"Connection Timeout=15;APP=LIB;Language=us_english;" +
"Encrypt=True;TrustServerCertificate=True;",
alias: "SqlServer");
//O, para múltiples conexiones:
builder.Services.AddDataToolkitWith(options =>
{
options.AddConnection("SqlServer", "Server=localhost;Database=pruebasdb;User Id=sqluser;Password=contrasena123;" +
"Pooling=true;Min Pool Size=3;Max Pool Size=30;" +
"Connection Timeout=15;APP=LIB;Language=us_english;" +
"Encrypt=True;TrustServerCertificate=True;", DatabaseProvider.SqlServer);
options.AddConnection("Sybase", "Host=myhost;Port=5000;Database=DB;...", DatabaseProvider.Sybase);
options.DefaultAlias = "SqlServer";
});Ejecutar un SQL con parámetros interpolados
var result = sql.FromSqlInterpolated($"SELECT * FROM Empleado WHERE Estado = {1}");
- [Key]: Se utiliza para especificar la propiedad o propiedades que actuarán como clave principal de una entidad
- [DatabaseGenerated(DatabaseGeneratedOption.Identity)]: El valor de la propiedad de identidad depende del proveedor de la base de datos.
- [Column]: Permite especificar el nombre de la columna.
- [Required]: Se utiliza en la declaración de propiedades o campos para indicar que el campo es requerido
- [NotMapped]: Una propiedad de una entidad no debe ser mapeada a una columna en la base de datos
- [JsonIgnore]: no se incluirá en la salida JSON generada por el serializador, ni será considerado al deserializar desde JSON
- [ValidateNever]: Si tienes un modelo con varias propiedades y quieres asegurarte de que una de ellas no se valide.
var empleados = sql.FromSqlMultiMap(new SqlMultiMapRequest { Sql = "EXEC sp_empleados_departamentos_empresas", Types = new[] { typeof(Empleado), typeof(Departamento), typeof(Empresa) }, SplitOn = "DepartamentoId,EmpresaId", MapFunction = objects => { var e = (Empleado)objects[0]; var d = (Departamento)objects[1]; var emp = (Empresa)objects[2]; return new EmpleadoDto { Nombre = e.Nombre, Departamento = d.Nombre, Empresa = emp.Nombre }; } });
DataToolkit.Library/ ├── Common/ ├── Connections/ ├── Extensions/ ├── Metadata/ ├── Repositories/ ├── Sql/ ├── StoredProcedures/ └── UnitOfWork/
Dapper AdoNetCore.AseClient Microsoft.Data.SqlClient
.NET 6.0 o superior SQL Server, Sybase u otros motores configurables
MIT
Fernando Poveda · @github.com/DomainDevs