dapper nuget 1.7枚舉映射

c# dapper enums mysql

從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的結果以某種方式返回預期的輸出

熱門答案

在修復錯誤之前,我的解決方法是修改具有額外條件的GetDeserializer方法

|| type.IsEnum

對枚舉使用struct deserializer如下:

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

        }


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因