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 枚举映射的主要内容,如果未能解决你的问题,请参考以下文章