Dapper: ¿es posible personalizar el mapeo de tipos de un campo específico de un tipo específico?

c# dapper micro-orm sql

Pregunta

Digamos que tengo esta clase de User :

public class User
{
    public int      ID          { get; set; }
    public string   FirstName   { get; set; }
    public string   LastName    { get; set; }
    public string   Email       { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime LastLogin   { get; set; }
}

Que quiero asignar a la siguiente tabla:

CREATE TABLE "user" (
  "ID"          int(11) NOT NULL AUTO_INCREMENT,
  "FirstName"   varchar(45) DEFAULT NULL,
  "LastName"    varchar(45) DEFAULT NULL,
  "Email"       varchar(255) NOT NULL,
  "DateCreated" int(11) NOT NULL,
  "LastLogin"   int(11) NOT NULL,
  PRIMARY KEY ("ID")
)

O escriba palabras más simples: quiero almacenar las propiedades DateTime como campos int en la base de datos. Sin embargo, este es el caso de esta clase / tabla. Otras clases / tablas pueden mapearse de manera diferente. Estaba pensando en algo parecido a una función de conversión personalizada en combinación con el tipo o el mapa de miembros.

¿Es posible lograr esto con Dapper, y si es así cómo?

Respuesta aceptada

La conclusión es que Dapper no es compatible con esto por diseño. Uno de sus principios básicos de diseño es un mapeo 1: 1 entre la tabla y el objeto, con la excepción de la asignación de nombres de columna a nombres de propiedad.

La solución que elegí al final fue combinar Dapper con AutoMapper, que de todos modos ya estamos haciendo un uso intensivo. En nuestros DAO Dapper, en casos complejos usamos un objeto entidad separado del objeto de dominio y el mapa entre ellos. Entonces, esencialmente, el mapeo no trivial entre dominio y tabla se convierte en una simple cuestión de mapeo de objeto a objeto.


Respuesta popular

Esto ahora debería ser posible con SqlMapper.TypeHandler personalizado. Ver este ejemplo en pruebas unitarias. La desventaja es que aplica el manejo de tipo personalizado a todos los campos del mismo tipo. En su caso, todas las propiedades DateTime se evaluarán a través del controlador de tipo.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow