我可以在PetaPoco中为参数和字段定义自定义类型映射吗

本文关键字:自定义 定义 类型 映射 字段 PetaPoco 参数 我可以 | 更新日期: 2023-09-27 18:28:18

我目前正在尝试选择一个C#ORM与我的PostgreSQL数据库一起使用,我对微ORM很感兴趣,因为它们可以让我更好地利用Postgres的功能(而且因为完整的ORM很难配置。虽然Dapper很简单,但试图处理NHibernate在我的屏幕上留下了前额形状的凹痕…)

无论如何,目前PetaPoco领先,但有一个功能我需要,但我不知道它是否有(公平地说,我在其他ORM中也找不到)-自定义类型的映射。

我的PostgreSQL数据库使用hstore和Postgis扩展,它们定义了自定义类型。我不希望任何ORM支持这些类型(很难找到支持PostgreSQL的ORM!),但我希望能够为它们提供自己的映射器,所以当我将它们作为列或作为参数发送时,PetaPoco将自动使用我的映射器。

这可能吗?我能找到的最接近的是IDbParameter支持,但这些都是内置类型,我需要为不在列表中的扩展类型编写映射器。。。

我可以在PetaPoco中为参数和字段定义自定义类型映射吗

根据Schoteme的评论,我提出了半个解决方案——如何将查询结果中的hstore解析到对象中。我把这个问题留到一边,以防有人想得到另一个解决方案。

我需要定义我自己的映射器。显然,我想对常规类型使用PetaPoco的默认映射,所以继承PetaPoco.StandardMapper是很自然的,但这不起作用,因为StandardMapper实现了PetaPoco.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对象的构造与Schotome的要点中的对象类似。

我还需要注册映射程序:

PetaPoco.Mappers.Register(Assembly.GetAssembly(typeof(MainClass)),new MyMapper());
PetaPoco.Mappers.Register(typeof(HStore),new MyMapper());

现在,当我从查询中读取时,所有这些都能很好地工作,但当我编写查询参数时却不能(尽管我定义了GetToDbConverter)。在编写查询参数的时候,似乎根本没有调用我的映射器。知道怎么做吗?