2011-11-28 14 views
30

Napotkano problem po uaktualnieniu do najnowszej wersji Dapper z Nuget (v 1.7).dapper nuget 1.7 przestawia mapowanie

Zawsze zwraca pierwszy element wyliczeniowy (to znaczy nie mapuje).

Używam MySQL jako bazy danych.

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

Daje oczekiwane wyjście w Dapper nuget v1.6. Czy to jest prawidłowe zachowanie dla nowej wersji (1.7)?

Aktualizacja:

Po wykonaniu niektórych badań z kilku aplikacji konsoli i świeżymi appications mvc3 Uważam, że zachowanie Dapper mapowania enum jest niespójne, kiedy mapa enum wpisz bezpośrednio.

Jednak mapowania enum jako właściwość klasy jakoś konsekwentnie powraca prawidłowa map

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

wynikiem user.Role jakoś zwraca oczekiwane wyjście

+0

Wygląda błędu; zaloguj się na stronie projektu –

+1

dziękuję, zaloguj już ... czekając na odpowiedź –

+0

Zostało to poprawione * w kodzie * od 10 maja. Jednak nie wdrożyliśmy ponownie Nuget, AFAIK. –

Odpowiedz

1

dopóki błąd jest stały mój obejście jest modyfikacja metody GetDeserializer z dodatkowym warunkiem

|| type.IsEnum

używać struct Deserializator za teksty stałe w następujący sposób:

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

     }