2013-08-18 5 views
0

현재 PostgreSQL 데이터베이스와 함께 사용하기 위해 C# ORM을 선택하려고합니다. Postgres의 기능을 더 잘 활용할 수 있기 때문에 마이크로 ORM에 관심이 있습니다. 구성합니다 .Dapper가 단순히 작동하는 동안 NHibernate를 처리하려고하면 내 화면에 이마 모양의 움푹 들어간 곳이 남았습니다 ...)PetaPoco에서 매개 변수 및 필드에 대한 사용자 정의 유형 매핑을 정의 할 수 있습니까?

현재 PetaPoco가 선두이지만 필요한 기능은 하나만 있습니다. 그것은 (공평하게 - 다른 ORM에서도 찾을 수 없음) - 사용자 정의 유형의 매핑입니다.

내 PostgreSQL 데이터베이스는 사용자 정의 유형을 정의하는 hstore 및 Postgis 확장자를 사용합니다. ORM이 이러한 유형을 지원할 것이라고 기대하지 않습니다 (PostgreSQL을 지원하는 것을 찾기가 어렵습니다!)하지만 필자는 내 자신의 mappers를 제공 할 수 있기를 원합니다. 그래서 열로 가져 오거나 매개 변수로 보내면됩니다. PetaPoco 내 매퍼를 자동으로 사용합니다.

이것도 가능합니까? 가장 가까운 내가 찾을 수있는 IDbParameter support,하지만 그 내장 된 형식이며 the list의 일부가 아닌 확장 유형에 대한 매퍼를 작성해야 ...

+0

NPoco는 매핑을 사용자 정의하는 방법이 포함 된 PetaPoco 포크입니다 .Hostore 및 DateTimeOffset을 포함한 PostgreSQL에 대한 작업을 이미 완료했습니다. . 내게 핑 소리를 내고 twitter에서 더 많은 정보를 얻을 수있다. – Schotime

+2

다음 기본 샘플을 보려면이 GIST를 체크 아웃 할 수있다 : htt ps : //gist.github.com/schotime/6314871 – Schotime

+0

@Schotime NuGet 갤러리에없는 npgsql2를 사용하기 때문에 NPoco를 사용할 수 없습니다 (갤러리의 npgsql은 버전 2입니다). ,하지만 여전히 호출됩니다. 'npgsql' 때문에 NPoco는 인식하지 못합니다). 그래도 원래의 PetaPoco에서 구현할 수있는 솔루션을 찾아내는 방향을 제시 했으므로 귀하의 요지는 매우 도움이되었습니다. –

답변

2

Schotime의 의견을 바탕으로, 나는 절반 해결책 쿼리 결과에서 hstore을 개체로 구문 분석합니다. 누군가가 다른 해결책을 원할 경우를 대비하여이 질문을 공개하고 있습니다.

내 매퍼를 정의해야합니다. 분명히 일반적인 유형의 PetaPoco의 기본 매핑을 사용하고자하므로 StandardMapper은 속성이없는 PetaPoco.IMapper의 필드를 구현하기 때문에 작동하지 않습니다. - 따라서이를 재정의 할 수 없습니다. 그 (것)들을 숨긴다, 그러나 그것은 진짜로 돕지 않는다).

내가 대신 한 직접 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는 단순히 쿼리 매개 변수를 작성할 때 호출되지 않습니다. 어떻게해야할까요?