如何使用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版本。