c# - stackoverflow - dapper nuget 1.7 enumeraciones mapeo
dapper stackoverflow (1)
He encontrado un problema después de actualizar a la última versión de Dapper desde Nuget (v 1.7).
Siempre devuelve el primer miembro 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 la salida esperada en Dapper nuget v1.6. ¿Es este el comportamiento correcto para la nueva versión (1.7)?
Actualizar:
Después de realizar algunas pruebas con algunas aplicaciones de consola y nuevas aplicaciones de mvc3, descubrí que el comportamiento de la asignación de enumeración Dapper es inconsistente cuando se asigna el tipo de enumeración directamente.
Sin embargo, la asignación de una enumeración como una propiedad de una clase de alguna manera siempre devuelve 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 de alguna manera devuelve el resultado esperado
Hasta que se solucione el error, mi solución es modificar el método GetDeserializer con una condición adicional
|| tipo.IsEnum
para usar struct deserializer para enumeraciones como sigue:
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);
}