Comment puis-je lancer Dapper.NET lorsque le jeu de résultats comporte des colonnes non mappées?

dapper

Question

En utilisant l'exemple de code ci-dessous comme contexte ... Quand j'exécute cette requête, j'obtiens le champ "Id" comme valeur par défaut (qui est 0 pour un int). Je voudrais dire à dapper de s'exécuter d'une manière qui provoquerait une exception s'il existe une colonne dans le jeu de résultats qui n'est pas mappée à une propriété de mon objet de résultat. (Je comprends que le problème est juste que je dois supprimer le «d» supplémentaire dans la requête SQL, mais cela m'intéresse de l'exposer plus explicitement)

Je n'ai rien pu trouver sur ce sujet. S'il vous plaît laissez-moi savoir si cela est même possible avec Dapper.

Merci d'avance (à part ce numéro, et pour ceux qui n'ont pas franchi le pas, Dapper est vraiment la meilleure chose depuis le pain tranché!).

class CustomerRecord
{
    public int Id { get; set; }
    public string Name { get; set; }
}

CustomerRecord[] GetCustomerRecords()
{
    CustomerRecord[] ret;
    var sql = @"SELECT 
                 CustomerRecordId AS Idd, 
                 CustomerName as Name
                 FROM CustomerRecord";

    using (var connection = new SqlConnection(this.connectionString))
    {
        ret = connection.Query<CustomerRecord>(sql).ToArray();
    }

    return ret;
}

Réponse populaire

Vous pouvez créer votre propre type de carte où vous utilisez DefaultTypeMap de Dapper et lancer une exception lorsqu'il ne peut pas trouver le membre:

public class ThrowWhenNullTypeMap<T> : SqlMapper.ITypeMap
{
    private readonly SqlMapper.ITypeMap _defaultTypeMap = new DefaultTypeMap(typeof(T));

    public ConstructorInfo FindConstructor(string[] names, Type[] types)
    {
        return _defaultTypeMap.FindConstructor(names, types);
    }

    public ConstructorInfo FindExplicitConstructor()
    {
        return _defaultTypeMap.FindExplicitConstructor();
    }

    public SqlMapper.IMemberMap GetConstructorParameter(ConstructorInfo constructor, string columnName)
    {
        return _defaultTypeMap.GetConstructorParameter(constructor, columnName);
    }

    public SqlMapper.IMemberMap GetMember(string columnName)
    {
        var member = _defaultTypeMap.GetMember(columnName);
        if (member == null)
        {
            throw new Exception();
        }
        return member;
    }
}

En contrepartie, vous devez configurer toutes les cartes de types pour chaque entité:

SqlMapper.SetTypeMap(typeof(CustomerRecord), typeof(ThrowWhenNullTypeMap<CustomerRecord>));

Cela pourrait être configuré en utilisant la réflexion, cependant.



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