dapper nuget 1.7 枚举映射

Posted

技术标签:

【中文标题】dapper nuget 1.7 枚举映射【英文标题】:dapper nuget 1.7 enums mapping 【发布时间】:2012-01-07 16:02:14 【问题描述】:

我从 Nuget (v 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();

user.Role 的结果以某种方式返回了预期的输出

【问题讨论】:

看起来像一个错误;请登录项目网站 谢谢,已经记录了……等待回复 自 5 月 10 日起,在代码中 已修复此问题。不过,我们还没有重新部署 Nuget,AFAIK。 【参考方案1】:

在修复错误之前,我的解决方法是使用额外条件修改 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);

        

【讨论】:

以上是关于dapper nuget 1.7 枚举映射的主要内容,如果未能解决你的问题,请参考以下文章

Dapper 可以返回映射对象和其他非映射值吗?

Dapper 映射结果列表

.NET Dapper - 映射计算属性

使用 Dapper 映射 Uri 字段

如何在 Dapper 上执行严格的映射

使用 Dapper 映射嵌套对象列表