2011-11-28 143 views
30

我从Nuget升级到Dapper的最新版本(v 1.7)后遇到问题。dapper nuget 1.7枚举映射

它总是返回第一枚枚举成员(即它无法映射)。

我正在使用MySQL作为数据库。

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

它给出了Dapper nuget v1.6的预期输出。这是新版本(1.7)的正确行为吗?

更新:

做一些测试与几个控制台应用程序和新鲜MVC3 appications后,我发现,当你映射了枚举直接键入小巧玲珑枚举映射的行为是不一致的。

然而,映射一个枚举作为一个阶级的属性不知何故始终返回正确的地图

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 [email protected]", new { id = 2 }).FirstOrDefault(); 

user.Role的结果莫名其妙地返回预期的输出

+0

看起来像一个错误;请在项目网站上登录 –

+1

谢谢,已经记录下来......等待回复 –

+0

自5月10日起,这个问题已经在代码*中修复了。不过,我们还没有重新部署Nuget,AFAIK。 –

回答

1

直到bug修复我的解决办法是修改GetDeserializer方法有额外的条件

|| type.IsEnum

使用结构解串器对枚举如下:

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

     }