2017-03-28 1 views
1

J'ai un ENUM comme:Magasin ENUM Char avec Dapper

public enum AccountStatus : byte 
{ 
    Locked = (byte)'L', 
    Active = (byte)'A', 
    Deleted = (byte)'D' 
} 

et souhaite stocker les valeurs char dans la base de données. Existe-t-il un moyen dans Dapper avec des mappes de types ou autrement pour définir quels types d'énumération doivent être mappés à leurs valeurs char (pour read/update/insert)?

Le membre de type anonyme déclarateur est également me empêchant de lancer la propriété en char directement dans la requête:

enter image description here

+2

Je ne pense pas que votre question est liée à l'erreur. Il veut que vous lui donniez un nom de propriété parce que c'est un type anonyme. 'new {Foo = (char) account.AccountStatus}' – TyCobb

+0

Merci pour cela - je voudrais encore pouvoir résoudre cela en termes plus généraux via une carte de type ou autrement ainsi il fonctionne aussi pour les lectures – TJF

Répondre

3

Comme mentionné par @TyCobb dans les commentaires, ce n'est pas un problème avec stocker un Enum comme un char, mais plutôt avec comment les propriétés de type anonymes sont déclarées.

types anonymes peuvent déduire et générer des noms pour « références de propriété simples » où aucune transformation se fait à la propriété lors de l'affectation, comme

new { account.AccountStatus } 

Dès que vous transformez les données ou du nouveau nom propriété, vous devez déclarer explicitement le nom de la propriété:

new { Status = (char)account.AccountStatus } 

en ce qui concerne lit, vous pouvez mapper à un char via pimpant, puis jeté comme ENUM dans votre sélection (ou transformer les données de quelque manière est la plupart appropria te):

var result = connection.Query<char>(
    "select char column from table where Status = @Status", 
    new {Status = (char)account.AccountStatus} 
).Select(x => (AccountStatus)x).FirstOrDefault(); 

En outre, Dapper gère également AccountStatus : byte cas natively, vous pouvez donc être en mesure de retourner directement la valeur que votre ENUM:

var result = connection.Query<AccountStatus>(
    "select char column from table where Status = @Status", 
    new {Status = (char)account.AccountStatus} 
).FirstOrDefault(); 
+0

Merci pour cela - I J'aimerais toujours pouvoir résoudre cela en termes plus généraux via une carte de type ou autrement, donc cela fonctionne aussi pour les lectures – TJF

+0

@TJF voir mise à jour. Vous pouvez développer la technique de mappage pour répondre aux besoins de votre carte de type. –