2013-03-15 4 views
3

У меня есть класс с (простым, первым разрезом) реализация пользовательских ролей:Указанный Cast не Invalid (Enum с Int значением, Щеголеватый)

class User { 
    public Role Role { get; set; } 
    // ... 
    public User() { this.Role = Role.Normal; } 
    public void Save() { Membership.CreateUser(...) } // System.Web.Security.Membership 
} 

enum Role : int { 
    Invalid = 0, 
    Normal = 1, 
    SuperUser = 4096 
} 

Перед добавлением роли, все работало нормально (если это важно).

Теперь, когда я пытаюсь принести пользователей, эта строка не может:

toReturn = conn.Query<User>("SELECT TOP 1 * FROM dbo.UserProfile WHERE 1=1"); 

Трассировка стека (от Elmah):

System.Data.DataException: Error parsing column 2 (Role=1 - Int16) ---> System.InvalidCastException: Specified cast is not valid. 
    at Deserialize06df745b-4fad-4d55-aada-632ce72e3607(IDataReader) 
    --- End of inner exception stack trace --- 
    at Dapper.SqlMapper.ThrowDataException(Exception ex, Int32 index, IDataReader reader) in c:\Dev\Dapper\Dapper\SqlMapper.cs:line 2126 
    at Deserialize06df745b-4fad-4d55-aada-632ce72e3607(IDataReader) 
    at Dapper.SqlMapper.<QueryInternal>d__d`1.MoveNext() in c:\Dev\Dapper\Dapper\SqlMapper.cs:line 827 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
    at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in c:\Dev\Dapper\Dapper\SqlMapper.cs:line 770 

В базе данных, тип столбца для Role является smallint ,

Я использую Dapper 1.12.1 от NuGet.

ответ

5

Gah. Ответ заключался в том, чтобы сопоставить определения базы данных и классов.

Для smallint (что для меня создано MigratorDotNet), мне понадобилось перечисление из short, а не int. Сейчас все работает.

Возможно, полезный вопрос в коде Google: https://code.google.com/p/dapper-dot-net/issues/detail?id=32