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

Disons que j’ai cette classe d’ User :

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

Ce que je veux mapper au 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") ) 

Vous pouvez également stocker les propriétés DateTime sous forme de champs int dans la firebase database. Cependant, c’est le cas pour cette classe / table. Les autres classes / tables peuvent être mappées différemment. Je pensais à quelque chose du genre d’une fonction de conversion personnalisée associée à une carte de types ou de membres.

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

En fin de compte, Dapper ne le supporte pas de par sa conception. L’un de ses principes de conception fondamentaux est le mappage 1: 1 entre la table et l’object, à l’exception des noms de colonne en mappage de noms de propriété.

La solution que j’ai retenue à la fin consistait à associer Dapper à AutoMapper, ce que nous utilisons déjà beaucoup. Dans nos DAO Dapper, dans les cas complexes, nous utilisons un object entité distinct de l’object du domaine et mappons entre eux. Ainsi, le mappage non sortingvial entre le domaine et la table devient une simple question de mappage d’object à object.

À ma connaissance, Dapper ne prend actuellement pas en charge de telles conversions. Vous pouvez utiliser les procs stockés dans Dapper et laisser le proc effectuer la conversion pour vous. Vous pouvez également vous assurer que les données / la conversion sont effectuées avant de transmettre l’object à Dapper.

Je me pose beaucoup de questions sur la raison pour laquelle vous opteriez pour int dates vs DateTime mais dans votre source de données … Cela semble inutile et excessivement complexe.

“Ecrivez toujours votre code comme si la prochaine personne à le gérer était un psychopathe à la hache qui connaissait l’adresse de votre domicile.”

Vous pouvez probablement utiliser la nouvelle méthode SqlMapper.SetTypeMap pour y parvenir. Voir https://stackoverflow.com/a/12615036/331281 pour plus d’informations.

Cela devrait maintenant être possible avec SqlMapper.TypeHandler personnalisé. Voir cet exemple dans les tests unitaires. L’inconvénient est qu’il applique la gestion 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 types.