2011-07-27 8 views
17

테이블을 POCO로 변환하기 위해 PetaPoco를 실험하고 있습니다.PetaPoco는 열거 형을 처리합니까?

내 테이블에는 TheEnum이라는 열이 있습니다. 그것은 MyEnum 값으로 문자열 "프레드"를 변환 할 때

public enum MyEnum 
{ 
    Fred, 
    Wilma 
} 

PetaPoco 초크 :이 열의 값은 다음 열거를 나타내는 문자열입니다. 여기

Convert.ChangeType(src, dstType, null); 

src는 "프레드"(a string)이며 dstTypetypeof(MyEnum)이다

이 라인에서 GetConverter이 방법을 수행.

예외는 내가 뭔가를 놓치고 있습니까 Invalid cast from 'System.String' to 'MyEnum'

말, InvalidCastException입니까? 먼저 등록해야 할 것이 있습니까?

나는하여 GetConverter 방법으로 다음을 추가하여 문제를 해결있어 :

if (dstType.IsEnum && srcType == typeof(string)) 
{ 
    converter = delegate(object src) 
      { 
       return Enum.Parse(dstType, (string)src) ; 
      } ; 
} 

는 분명히, 나는 그것이 엄청난 일을 늦출 수 있습니다로 모든 행에이 대리자를 실행하지 않습니다. 이 enum과 그 값을 사전에 등록하여 속도를 높일 수는 있지만, 이와 같은 것이 이미 제품에있을 가능성이 높습니다.

제 질문은 PetaPoco에 제 열거 형을 등록하는 데 특별한 조치를 취해야합니까?

업데이트 2012년 2월 23일

얼마 전 submitted a patch하지만 아직 당겨되지 않았습니다. 그것을 사용하고 싶다면, 패치를보고 자신의 코드에 병합하거나 코드 from here을 얻으십시오.

+0

** ** 2012 년 6 월 28 일 업데이트 ** 정확한 패치는 아직 적용되지 않았지만 유사한 코드가 [v5 branch] (https://github.com/toptensoftware/PetaPoco/tree/v5)에 추가되었습니다. http://www.toptensoftware.com/Articles/137/Long-Time-No-Post-and-PetaPoco-v5 –

+0

만약 당신이 어렵지 않다면, pls도 npoco에 패치를 제출하십시오. npoco로 전환하는 것이 좋습니다. 왜냐하면 더 많은 개발이 필요하고 PetaPoco가 가지고있는 모든 기능을 갖추고 있기 때문입니다. – AuthorProxy

+0

** 2014 년 9 월 9 일 업데이트 ** @iano 대답은 최신 5.0.2 ** 버전에 대한 올바른 답변입니다. –

답변

5

네가 맞아, 열거 형을 처리하는 것은 PetaPoco에 내장되어 있지 않으며, 보통 나는 네가 한 일을 정확히 수행 할 것을 제안한다.

열거 형을 사용하지 않는 요청의 경우 처리 속도가 느려지지 않음에 유의하십시오. PetaPoco는 응답을 pocos에 매핑하는 코드를 생성하므로 실제로 필요한 경우에만 대리인이 호출됩니다. 즉, GetConverter는 특정 poco 유형이 처음 사용될 때만 호출되며 열거 형 변환이 필요한 경우에만 델리게이트가 호출됩니다. Enum의 속도는 확실하지 않습니다. 너무 가벼운 경우 일지라도 사전에 캐시 할 수는 있습니다.

+0

Brad에게 감사드립니다. 열거 형 조회를 추가하고 패치를 제출하겠습니다. –

+0

2011 년 12 월 27 일 기준으로 패치가 적용되지 않았습니다. 그것은 좋은 추가 일 것이다. – JCallico

+0

** ** 2012 년 6 월 28 일 업데이트 ** 정확한 패치는 아직 적용되지 않았지만 유사한 코드가 [v5 branch] (https://github.com/toptensoftware/PetaPoco/tree/v5)에 추가되었습니다. http://www.toptensoftware.com/Articles/137/Long-Time-No-Post-and-PetaPoco-v5도 참조하십시오. –

5

4.0.3을 사용 중이며 PetaPoco는 열거 형을 정수로 자동 변환합니다. 그러나, 나는 열거하고 등을 맞댄 나의 enums를 개조하고 싶었다. Steve Dunn's EnumMapper 및 PetaPoco의 IMapper을 이용하여이 문제를 해결했습니다. 고마워.

DB에서는 Nullable<TEnum> 또는 null 값을 처리하지 않습니다. 그것을 사용하려면 PetaPoco의 T4 생성을 사용하는 경우 PetaPoco.Database.Mapper = new MyMapper();

class MyMapper : PetaPoco.IMapper 
{ 
    static EnumMapper enumMapper = new EnumMapper(); 

    public void GetTableInfo(Type t, PetaPoco.TableInfo ti) 
    { 
     // pass-through implementation 
    } 

    public bool MapPropertyToColumn(System.Reflection.PropertyInfo pi, ref string columnName, ref bool resultColumn) 
    { 
     // pass-through implementation 
     return true; 
    } 

    public Func<object, object> GetFromDbConverter(System.Reflection.PropertyInfo pi, Type SourceType) 
    { 
     if (pi.PropertyType.IsEnum) 
     { 
      return dbObj => 
      { 
       string dbString = dbObj.ToString(); 
       return enumMapper.EnumFromString(pi.PropertyType, dbString); 
      }; 
     } 

     return null; 
    } 

    public Func<object, object> GetToDbConverter(Type SourceType) 
    { 
     if (SourceType.IsEnum) 
     { 
      return enumVal => 
      { 
       string enumString = enumMapper.StringFromEnum(enumVal); 
       return enumString; 
      }; 
     } 

     return null; 
    } 
} 
5

를 설정하고 당신은 당신의 발생 유형 열거, 당신은 데이터베이스에 PropertyType 재정을 사용할 수 있습니다합니다.TT :

tables["App"]["Type"].PropertyType = "Full.Namespace.To.AppType"; 
+0

매우 유용합니다. 감사! –

0

내가 대신 코드 등 "관리"때문에 당신이 PetaPoco 클래스의 업데이트 기능을 찾을 수 있습니다 인덱스 번호 (예 : 1,2,4)의 열거의 값을 저장할 , 너겟 패키지로 추가하면 .cs 파일이 프로젝트에 저장됩니다. 대신 2

의 "노란색"저장 것이다

//enum? 
if (i.Value.PropertyInfo.PropertyType.IsEnum) 
{ 
     AddParam(cmd, i.Value.GetValue(poco).ToString(), i.Value.PropertyInfo); 
} 
else 
{ 
     // Store the parameter in the command 
     AddParam(cmd, i.Value.GetValue(poco), i.Value.PropertyInfo); 
} 

:

// Store the parameter in the command 
AddParam(cmd, pc.GetValue(poco), pc.PropertyInfo); 

변화 : 우리는

대신에 열거 변수 색상 = {, 노란색, 파란색, 빨간색}을했을 경우

관련 문제