2011-11-28 17 views
30

Nuget(v 1.7)からDapperの最新バージョンにアップグレードした後に問題が発生しました。dapper nuget 1.7 enums mapping

常に最初の列挙型メンバを返します(つまり、マップに失敗します)。

私はデータベースとして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)の正しい動作ですか?

アップデート:私はあなたが直接列挙型をマップする際にDapperの列挙マッピングの行動が矛盾していることがわかったいくつかのコンソールアプリケーションと新鮮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

を返す返すよう列挙型のマッピング追加条件で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); 

     }