2013-08-18 21 views
0

我目前正在嘗試選擇一個C#ORM與我的PostgreSQL數據庫一起使用,並且我對微ORM感興趣,因爲它們允許我更好地利用Postgres的功能(並且由於全面的ORM很難雖然Dapper只是工作,試圖對付NHibernate已經在我的屏幕上留下額頭形凹痕...)我可以爲PetaPoco中的參數和字段定義自定義類型映射嗎?

反正,目前PetaPoco有領先,但有一個功能,我需要和無法數字如果它有(公平地說 - 我無法在其他ORM中找到它) - 自定義類型的映射。

我的PostgreSQL數據庫使用定義自定義類型的hstore和Postgis擴展。我不希望任何ORM支持這些類型(很難找到支持PostgreSQL的類型),但我希望能夠爲他們提供我自己的映射器,所以當我將它們作爲列或將它們作爲參數發送時,PetaPoco會自動使用我的映射器。

這甚至可能嗎?我能找到的最接近的是IDbParameter support,但這些都是內置類型,我需要寫是不是the list部分擴展類型映射器...

+0

NPoco是PetaPoco的一個分支,它包含一種自定義映射的方法。我已經完成了PostgreSQL的工作,包括HStore和DateTimeOffset 。在Twitter上ping我@schotime瞭解更多信息 – Schotime

+2

您也可以檢查此GIST的基本示例:htt ps://gist.github.com/schotime/6314871 – Schotime

+0

@Schotime我不能使用NPoco,因爲它使用不在NuGet Gallery中的npgsql2(圖庫中的npgsql是版本2,但它仍然被稱爲'npgsql'因此NPoco不會識別它)。不過,你的要點非常有幫助,因爲它給了我一個找到(一半)可以在原始PetaPoco中實現的解決方案的方向。 –

回答

2

基於Schotime的評論,我想出了一個半解決方案 - 如何將查詢結果中的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對象的構成類似於一個在Schotime's gist

我還需要註冊的映射:

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

現在,這一切完美的作品時,我從查詢閱讀 - 但不是我寫的查詢參數(即使我定義GetToDbConverter看來我當我編寫查詢參數時,mapper根本不會被調用。任何想法如何做?

相關問題