Modifier l'implémentation par défaut de ITypeMap de Dapper

dapper

Question

Je cherche un moyen de changer l'implémentation par défaut de ITypeMap utilisée par Dapper.

La base de données sur laquelle je travaille utilise des traits de soulignement dans tous les noms de colonne. Par exemple "COLUMN_NAME". Je ne veux pas que mes classes POCO utilisent des noms de propriété avec des caractères de soulignement, je préfère utiliser les conventions C # pour nommer les propriétés sur mes classes POCO. Je ne veux pas non plus avoir à écrire de longues listes de sélection de "COLUMN_NAME AS ColumnName", ni même abandonner la possibilité de faire "SELECT * FROM ..".

J'ai trouvé que Dapper me permet d'écrire mon propre ITypeMap, ce que j'ai fait et ça marche très bien! Dans mon cas, je peux écrire un mappeur qui fonctionnera pour toute instruction select - il mappe simplement les noms de colonnes aux noms de propriétés avec les traits de soulignement supprimés. Cependant, comme je possède ma propre implémentation d'ITypeMap, je dois appeler SqlMapper.SetTypeMap () au moins une fois pour chaque type POCO. L'une des choses que j'aime avec Dapper, c'est qu'il n'y a aucun appel d'installation requis lorsque vous utilisez le mappeur par défaut. J'essaie désespérément de conserver cette expérience autant que possible, tout en utilisant ITypeMap personnalisée.

Donc, au lieu de l'élégant:

connection.Query<Animal>("select..");

J'ai:

SqlMapper.SetTypeMap(typeof(Animal), new TypeMap<Animal>());
connection.Query<Animal>("select..");

Il y a encore plus de code lorsque vous commencez à garder une trace des types qui ont déjà été enregistrés avec SetTypeMap ().

La meilleure solution que j'ai trouvée jusqu'à présent consiste à envelopper tous les remplacements de SqlMapper.Query (). Dans les méthodes encapsulées, je peux vérifier et appeler SetTypeMap () avant d'appeler SqlMapper.Query ().

Quelque chose comme ça:

public static class DapperWrapper
{
    private static List<Type> _knownTypes = new List<Type>();

    public static IEnumerable<T> Query2<T>(this IDbConnection cnn, string sql, ...);
    {
        Setup<T>();

        return cnn.Query<T>(sql, ...);            
    }

    private static void Setup<T>()
    {
        Type type = typeof(T);

        if (!_knownTypes.Contains(type))
        {
            SqlMapper.SetTypeMap(type, new TypeMap<T>());
            _knownTypes.Add(type);
        }
    }
}

Cela me ramène là où je veux être:

connection.Query2<Animal>("select..");

Existe-t-il une meilleure façon de le faire? Il semble que DapperExtensions a quelque chose comme ça dans AutoMapper, mais je ne sais pas si cela fonctionne avec SqlMapper.Query ().

Réponse populaire

Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;

https://stackoverflow.com/a/34536829/1315626




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