TypeHandler ne semble pas s'appeler

c# dapper type-conversion

Question

La version courte

SqlMapper.Query<T> semble ignorer mon TypeHandler<T> enregistré TypeHandler<T>

La version longue

Voici une requête simple:

SELECT 'Foo' AS CategoryName, 200 AS CategoryRating

... et voici deux POCO:

public class RatingValue
{
    public Int32 Value { get; set; }
    // ... some other properties etc ...
}

public class MyResult
{
    public String CategoryName { get; set; }
    public RatingValue CategoryRating { get; set; }
}

J'ai créé une nouvelle TypeHandler mise en œuvre qui devrait transformer cette CategoryRating Int32 dans un RatingValue objet:

public class RatingValueHandler: SqlMapper.TypeHandler<RatingValue>
{
    public override RatingValue Parse(object value)
    {
        if (value is Int32)
            return new RatingValue() { Value = (Int32)value };

        throw new FormatException("Invalid conversion to RatingValue");
    }

    public override void SetValue(System.Data.IDbDataParameter parameter, RatingValue value)
    {
        // ... null, range checks etc ...
        parameter.DbType = System.Data.DbType.Int32;
        parameter.Value = Int32.Parse(value.Value);
    }
}

Maintenant, avant d'exécuter ma requête, j'ajoute mon nouveau gestionnaire comme ceci:

SqlMapper.AddTypeHandler<RatingValue>(new RatingValueHandler());

Cependant, quand je lance ceci:

c.Query<MyResult>("SELECT 'Foo' AS CategoryName, 200 AS CategoryRating");

Je reçois une exception de Dapper - il n'a pas pu analyser les résultats dans la colonne 1. Je m'attendais à ce que Dapper lance mon gestionnaire de type personnalisé!

Je pense que je manque quelque chose de très, très évident. S'il te plaît, dis-moi comment je suis bête!

Réponse acceptée

Ce n'est pas toi d'être idiot. c'est moi; les éléments suivants passent maintenant localement (poussés à github); se déploiera bientôt sur NuGet maintenant disponible sur NuGet en v1.27 et supérieur:

public void SO24740733_TestCustomValueHandler()
{
    Dapper.SqlMapper.AddTypeHandler(RatingValueHandler.Default);
    var foo = connection.Query<MyResult>(
        "SELECT 'Foo' AS CategoryName, 200 AS CategoryRating").Single();

    foo.CategoryName.IsEqualTo("Foo");
    foo.CategoryRating.Value.IsEqualTo(200);
}

public void SO24740733_TestCustomValueSingleColumn()
{
    Dapper.SqlMapper.AddTypeHandler(RatingValueHandler.Default);
    var foo = connection.Query<RatingValue>(
        "SELECT 200 AS CategoryRating").Single();

    foo.Value.IsEqualTo(200);
}


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