Dapper: est-il possible de personnaliser le mappage de type d'un champ spécifique d'un type spécifique?

c# dapper micro-orm sql

Question

Disons que j'ai cette classe d' 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 je veux mapper sur le tableau suivant:

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")
)

Ou mettre des mots plus simples: je veux stocker les propriétés DateTime en tant que champs int dans la base de données. Cependant, c'est le cas pour cette classe / table. D'autres classes / tables peuvent être cartographiées différemment. Je pensais à quelque chose du genre d'une fonction de conversion personnalisée en combinaison avec un type ou une carte de membre.

Est-il possible d'y parvenir avec Dapper et si oui comment?

Réponse acceptée

L'essentiel est que Dapper ne le supporte pas par conception. L'un de ses principes de conception de base est un mappage 1: 1 entre la table et l'objet, à l'exception des noms de colonnes et du mappage de noms de propriétés.

Au final, la solution consistait à combiner Dapper avec AutoMapper, que nous utilisons déjà de toute façon. Dans nos DAO Dapper, dans les cas complexes, nous utilisons un objet entité distinct de l'objet et de la carte du domaine. Ainsi, le mappage non trivial entre le domaine et la table devient essentiellement une simple question de mappage objet à objet.


Réponse populaire

Cela devrait maintenant être possible avec SqlMapper.TypeHandler personnalisé. Voir cet exemple dans les tests unitaires. L'inconvénient est qu'il applique un traitement de type personnalisé à tous les champs du même type. Dans votre cas, toutes les propriétés DateTime seront évaluées via le gestionnaire de type.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi