2011-11-28 14 views
30

He encontrado un problema después de actualizar a la última versión de Dapper de Nuget (v 1.7).dapper nuget 1.7 enumeración enums

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

Estoy utilizando 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 [email protected]", 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)?

Actualización:

Después de hacer algunas pruebas con una aplicación de consola pocos y appications MvC3 frescas He encontrado que el comportamiento de mapeo enumeración Dapper es inconsistente cuando asigna la enumeración escribir directamente.

Sin embargo, la cartografía de una enumeración como una propiedad de una clase de alguna manera vuelve constantemente 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 u[email protected]", new { id = 2 }).FirstOrDefault(); 

el resultado de user.Role alguna manera devuelve la salida esperada

+0

Parece que un error; por favor inicie sesión en el sitio del proyecto –

+1

gracias, conéctese ya ... esperando la respuesta –

+0

Esto ha sido arreglado * en el código * desde el 10 de mayo. Sin embargo, no hemos vuelto a implementar Nuget, AFAIK. –

Respuesta

1

Hasta que el problema se fija mi solución es modificar el método GetDeserializer con la condición adicional

|| type.IsEnum

utilizar deserializer estructura de las enumeraciones 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); 

     }