2011-11-28 148 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); 

     }