根据 Schotime 的评论,我提出了一半的解决方案 - 如何hstore
将查询结果解析为对象。如果有人想获得其他解决方案,我将保留这个问题。
我需要定义自己的映射器。显然我想对常规类型使用 PetaPoco 的默认映射,所以继承是很自然的PetaPoco.StandardMapper
——但这不起作用,因为StandardMapper
implementsPetaPoco.IMapper
的字段没有virtual
属性——所以我不能覆盖它们(我只能掩盖它们,但是这并没有真正的帮助)。
我所做的是IMapper
直接实现,并将常规类型委托给以下实例PetaPoco.IMapper
:
public class MyMapper:PetaPoco.IMapper{
private PetaPoco.StandardMapper standardMapper=new PetaPoco.StandardMapper();
public PetaPoco.TableInfo GetTableInfo(Type pocoType){
return standardMapper.GetTableInfo(pocoType);
}
public PetaPoco.ColumnInfo GetColumnInfo(PropertyInfo pocoProperty){
return standardMapper.GetColumnInfo(pocoProperty);
}
public Func<object, object> GetFromDbConverter(PropertyInfo TargetProperty, Type SourceType){
if(TargetProperty.PropertyType==typeof(HStore)){
return (x)=>HStore.Create((string)x);
}
return standardMapper.GetFromDbConverter(TargetProperty,SourceType);
}
public Func<object, object> GetToDbConverter(PropertyInfo SourceProperty){
if(SourceProperty.PropertyType==typeof(HStore)){
return (x)=>((HStore)x).ToSqlString();
}
return standardMapper.GetToDbConverter(SourceProperty);
}
}
该HStore
对象的构造类似于Schotime 的 gist中的对象。
我还需要注册映射器:
PetaPoco.Mappers.Register(Assembly.GetAssembly(typeof(MainClass)),new MyMapper());
PetaPoco.Mappers.Register(typeof(HStore),new MyMapper());
现在,当我从查询中读取时,所有这些都可以完美运行 - 但在我编写查询参数时(即使我定义GetToDbConverter
了 . ?