我目前正在尝试选择一个C#ORM用于我的PostgreSQL数据库,我对micro-ORM很感兴趣,因为它们让我更好地利用Postgres的强大功能(因为完全破坏的ORM很难配置。虽然Dapper只是工作,试图处理NHibernate在我的屏幕上留下了额头形状的凹痕......)
无论如何,目前PetaPoco领先,但有一个我需要的功能,无法确定它是否具有(公平 - 我在其他ORM中找不到它) - 自定义类型的映射。 / p>
我的PostgreSQL数据库使用hstore和Postgis扩展,它们定义了自定义类型。我不希望任何ORM支持这些类型(很难找到一个支持PostgreSQL!)但我希望能够为它们提供我自己的映射器,所以当我将它们作为列或将它们作为参数发送时PetaPoco将自动使用我的地图制作者。
这甚至可能吗?我能找到的最接近的是IDbParameter support,但这些是内置类型,我需要为不属于the list的扩展类型编写映射器......
答案 0 :(得分:2)
根据Schotime的评论,我提出了半个解决方案 - 如何将查询结果中的hstore
解析为对象。我打开这个问题,万一有人想要得到另一个解决方案。
我需要定义自己的映射器。显然我想将PetaPoco的默认映射用于常规类型,因此继承PetaPoco.StandardMapper
是很自然的 - 但这不起作用,因为StandardMapper
实现了PetaPoco.IMapper
的字段而没有virtual
1}}属性 - 所以我不能覆盖它们(我只能掩盖它们,但这并没有真正帮助)。
我所做的是直接实现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's gist中的对象类似。
我还需要注册映射器:
PetaPoco.Mappers.Register(Assembly.GetAssembly(typeof(MainClass)),new MyMapper());
PetaPoco.Mappers.Register(typeof(HStore),new MyMapper());
现在,当我从查询中读取时,所有这一切都非常有效 - 但是当我编写查询参数时(即使我定义了GetToDbConverter
)也没有。当我在编写查询时,我的映射器似乎没有被调用参数。知道怎么做吗?