dapper nuget 1.7 enums mapping - PullRequest
       20

dapper nuget 1.7 enums mapping

30 голосов
/ 28 ноября 2011

Я столкнулся с проблемой после обновления до последней версии Dapper из Nuget (v 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 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 как-то возвращает ожидаемый результат

1 Ответ

1 голос
/ 28 мая 2012

Пока ошибка не устранена, мой обходной путь - изменить метод 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);

        }
...