基於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根本不會被調用。任何想法如何做?
NPoco是PetaPoco的一個分支,它包含一種自定義映射的方法。我已經完成了PostgreSQL的工作,包括HStore和DateTimeOffset 。在Twitter上ping我@schotime瞭解更多信息 – Schotime
您也可以檢查此GIST的基本示例:htt ps://gist.github.com/schotime/6314871 – Schotime
@Schotime我不能使用NPoco,因爲它使用不在NuGet Gallery中的npgsql2(圖庫中的npgsql是版本2,但它仍然被稱爲'npgsql'因此NPoco不會識別它)。不過,你的要點非常有幫助,因爲它給了我一個找到(一半)可以在原始PetaPoco中實現的解決方案的方向。 –