dapper nuget 1.7 enumeración de enums

c# dapper enums mysql

Pregunta

Me encontré con un problema después de actualizar a la última versión de Dapper de Nuget (v 1.7).

Siempre devuelve el primer miembro de enums (es decir, falla en los mapas).

Estoy usando MySQL como la base de datos.

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();

Da el resultado esperado en Dapper nuget v1.6. ¿Es este el comportamiento correcto para la nueva versión (1.7)?

Actualizar:

Después de hacer algunas pruebas con algunas aplicaciones de consola y nuevas aplicaciones de mvc3, encontré que el comportamiento del mapeo enum de Dapper no es consistente cuando mapea el tipo de enumeración directamente.

Sin embargo, mapear una enumeración como una propiedad de una clase de alguna manera devuelve de manera consistente el mapa correcto

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();

el resultado de user.Role devuelve de alguna manera el resultado esperado

Respuesta popular

Hasta que se solucione el error, mi solución es modificar el método GetDeserializer con una condición adicional.

|| type.IsEnum

usar struct deserializer para enums de la siguiente manera:

        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);

        }


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow