30 votes

dapper nuget 1.7 énumère le mappage

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

Il retourne toujours la première enums membre (qui est, il ne parviennent pas à cartes).

Je suis en utilisant 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 les résultats escomptés dans Dapper nuget v1.6. Est-ce le bon comportement de la nouvelle version (1.7)?

Mise à jour:

Après avoir fait quelques tests avec un peu d'application console et frais mvc3 applications, j'ai trouvé que le comportement de Dapper enum cartographie est incompatible lorsque vous mappez le type enum directement.

Toutefois, la cartographie d'un enum comme une propriété d'une classe, d'une certaine manière systématiquement renvoie 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 l'utilisateur.Rôle en quelque sorte renvoie le résultat attendu

1voto

SlavaGu Points 369

Jusqu'à ce que le bug soit corrigé, ma solution consiste à modifier la méthode GetDeserializer avec une condition supplémentaire

|| type.IsEnum

pour utiliser le désérialiseur struct 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);

        }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X