dapper nuget 1.7 enumsのマッピング

c# dapper enums mysql

質問

私はNugetのDapper(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アプリケーションでいくつかのテストを行った後、私はDaum enumマッピングの動作がenum型を直接マッピングすると一貫性がないことを発見しました。

しかし、クラスのプロパティとして列挙型をマッピングすると、一貫して正しいマップが返されます

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メソッドを変更することです

||型.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は合法ですか? はい、理由を学ぶ