使用Dapper处理自定义类型

时间:2014-12-11 15:35:50

标签: c# dapper

如何使用Dapper处理自定义类型,以便将具有这些自定义类型的属性插入到数据库中?

这是我到目前为止所做的:

如果我有类User和SomeOtherClass

public class User {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Username { get; set; }
}

public class SomeOtherClass {
    public int Id { get; set; }
    public User user { get; set; }
}

我想将SomeOtherClass的实例插入到我的数据库中,Dapper不知道如何处理用户属性并解决这个问题我为User类创建了一个TypeHandler,以指定如何插入User类型的属性。 / p>

public class UserTypeHandler : SqlMapper.TypeHandler<User> {
    public override User Parse(object value) {
        throw new NotImplementedException();
    }

    public override void SetValue(System.Data.IDbDataParameter parameter, User value) {
        parameter.Value = value.Id;
    }
}

SqlMapper.AddTypeHandler(typeof(User), new UserTypeHandler());

插入对象工作正常,Dapper正确插入用户属性的Id 但是执行以下查询

Connection.Query<User>(@"SELECT * FROM User");

调试将在

中的NotImplementedException处停止
public override User Parse(object value)

其中值是User类的属性之一,具体取决于返回列的顺序。

问题似乎是当我使用SqlMapper.AddTypeHandler注册TypeHandler时,Dapper随后会在读取类型为T的对象时使用此TypeHandler来处理类型T的所有属性,而不是使用它来处理T属性作为类型。

这可能是预期的行为,但对我来说似乎是违反直觉的,我没有看到我如何知道在Parse方法的哪个调用中传递了什么并相应地映射它。

编辑:我正在使用Dapper库的NuGet版本。

0 个答案:

没有答案