Dapper NuGet 1.7 枚举映射

29

我在从Nuget(版本1.7)升级到Dapper的最新版本后遇到了一个问题。

它总是返回第一个枚举成员(也就是说,它无法进行映射)。

我正在使用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 userId=@id", new { id = 2 }).FirstOrDefault();

在Dapper Nuget v1.6中,它给出了预期的输出结果。新版本(1.7)的行为是否正确?

更新:

通过对一些控制台应用程序和新的MVC3应用程序进行测试,我发现当你直接映射枚举类型时,Dapper枚举映射的行为是不一致的。

然而,将枚举作为类的属性映射时,不知何故总是返回正确的映射。

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

用户角色的结果以某种方式返回了预期的输出


看起来像是一个 bug,请在项目网站上记录它。 - Marc Gravell
1
谢谢,已经记录了...等待回复。 - Anton Hasan
自5月10日起,此问题已在代码中得到修复。据我所知,我们尚未重新部署Nuget。 - Marc Gravell
1个回答

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

        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接