Carte d'un char à un booléen

c# dapper

Question

Nous utilisons Dapper en tant qu'ORM dans une base de données Informix héritée, et dans cette base de données, les champs booléens sont en fait stockés sous la forme d'un Char, avec «F» qui signifie False et «T» qui signifie True.

Dans notre POCO, nous aimerions exposer une propriété booléenne unique et demander à Dapper de mapper vers / depuis la valeur de caractère appropriée lors de la lecture et de l'écriture dans la base de données.

Par exemple:

Disons que nous avons un champ dans une table appelée "Active". La valeur dans la base de données pour la colonne active sera soit "T" de "F"

Notre POCO peut ressembler à ceci:

public class MyTable
{
    public bool Active { get; set; }
}

Est-il possible de créer un mappage personnalisé dans Dapper qui pour cette colonne définisse la propriété Active dans le POCO sur true si la valeur sous-jacente est "T", et false si "F"?

Une des façons dont je pourrais contourner ce problème est d'avoir deux propriétés, l'une étant une chaîne que Dapper peut mapper directement et l'autre une valeur booléenne utilisée par les consommateurs du POCO. c'est à dire:

public class MyTable
{
    public string Active { get; set; }
    public bool MyActive 
    {
        get { return Active == "T"; }
        set { Active = (value == "T"); }
    }
}

L'inconvénient de cette approche est de devoir conserver deux propriétés, donc ce serait bien s'il y a un moyen d'étendre dapper pour qu'il le fasse pour moi (d'autant plus qu'il y a beaucoup de champs dans notre base de données) .

J'ai examiné l'implémentation d'une carte de type personnalisée, mais même si cela fonctionne pour un type complexe personnalisé, je ne sais pas comment cela fonctionnerait dans ce cas lorsque je souhaite mapper d'un type de base à un autre type de base.

Réponse acceptée

Je doute que Dapper le soutienne, jetez un coup d'œil à la réponse à cette question . Comme vous pouvez le voir, la propriété Active ne doit même pas être publique, rendez-la private pour éviter toute confusion. Cependant, je nommerais votre propriété bool IsActive .

public class MyTable
{
    private string Active { get; set; }
    public bool IsActive 
    {
        get { return Active == "T"; }
        set { Active = value ? "T" : "F"; }
    }
}



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