Dapper nuget 1.7枚举映射

本文关键字:枚举 映射 nuget Dapper | 更新日期: 2023-09-27 18:15:49

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

它总是返回第一个enum成员(也就是说,它不能映射)。

我使用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枚举映射的行为不一致。

然而,将枚举映射为类的属性,以某种方式一致地返回正确的map

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

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

Dapper nuget 1.7枚举映射

在此bug修复之前,我的解决方法是使用额外的条件修改GetDeserializer方法

| |类型。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);
        }