Dapper nuget 1.7 enum mapping

c# dapper enums mysql

Question

J'ai rencontré un problème après la mise à niveau vers la dernière version de Dapper à partir de Nuget (v 1.7).

Il renvoie toujours le premier membre de la liste (c’est-à-dire qu’il échoue aux cartes).

J'utilise MySQL comme base de données.

CREATE TABLE `users_roles` (
    `userId` INT(11) NOT NULL,
    `roleId` INT(11) NOT NULL,  
    KEY `user_id` (`userId`),
    KEY `role_id` (`roleId`)
);

INSERT INTO `users_roles` (`userId`, `roleId`) VALUES (1, 1);
INSERT INTO `users_roles` (`userId`, `roleId`) VALUES (2, 2);

public enum Role { 
  Anonymous = 0, Authenticate = 1, Administrator = 2
}

var role = Current.Db.Query<Role>(@"SELECT roleId as Role FROM users_roles
    WHERE userId=@id", new { id = 2 }).FirstOrDefault();

Il donne la sortie attendue dans Dapper nuget v1.6. Est-ce le comportement correct pour la nouvelle version (1.7)?

Mettre à jour:

Après avoir effectué quelques tests avec quelques applications de console et de nouvelles applications mvc3, j'ai constaté que le comportement du mappage enum Dapper est incohérent lorsque vous mappez directement le type enum.

Cependant, le mappage d'une enum en tant que propriété d'une classe renvoie de manière cohérente la carte correcte

public class User
{
   public int Id { get; set; }
   public Role Role { get; set; }
}

var user = Current.Db.Query<User>(@"SELECT roleId as Role, userId as Id 
    FROM users_roles
    WHERE userId=@id", new { id = 2 }).FirstOrDefault();

le résultat de user.Role renvoie en quelque sorte la sortie attendue

Réponse populaire

Tant que le bogue n'est pas corrigé, ma solution consiste à modifier la méthode GetDeserializer avec des conditions supplémentaires

|| type.IsEnum

utiliser struct deserializer pour les énumérations comme suit:

        private static Func<IDataReader, object> GetDeserializer(Type type, IDataReader reader, int startBound, int length, bool returnNullIfFirstMissing)
        {
...
            if (!(typeMap.ContainsKey(type) || type.IsEnum /* workaround! */ || type.FullName == LinqBinary))
            {
                return GetTypeDeserializer(type, reader, startBound, length, returnNullIfFirstMissing);
            }
            return GetStructDeserializer(type, startBound);

        }



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