2010-07-31 4 views
0

저는 C#과 Subsonic을 처음 사용합니다. 다음 사례를 해결하려고합니다.SubSonic SimpleRepository 저장 멤버 클래스

public class UnknownInt { 
    public int val; 
    public bool known; 
} 

public class Record { 
    public int ID; 
    public UnknownInt data; 
} 

저는 SimpleRepository를 사용하고 있습니다. SQL 데이터베이스 (아마도 XML 텍스트 필드로)에 저장하기 전에 UnknownInt를 직렬화 할 수있는 방법이 있습니까?

사용자가 '정수'답변을 제공 할 수있는 설문지 시스템을 구축하려고합니다. 'Unknown'대답뿐 아니라 Null 응답 (아직 답변되지 않은 질문)

즉, SubSonic 3.0 단순 리포지토리로 변환 및 변환하려면 내 UnknownInt 클래스가 구현해야하는 인터페이스는 무엇입니까?

건배!

답변

1

내가 이런 짓을 했을까 :

public class Record 
{ 
    public int ID {get;set;} 

    [EditorBrowsable(EditorBrowsableState.Never)] 
    public int UnknownIntValue {get;set;} 

    [EditorBrowsable(EditorBrowsableState.Never)] 
    public bool UnknownIntKnown {get;set;} 

    [SubSonicIgnore] 
    public UnknownInt UnknownInt 
    { 
     get 
     { 
      return new UnknownInt() 
      { 
       val = UnknownIntValue, 
       known = this.UnknownIntKnown 
      }; 
     } 
     set 
     { 
      this.UnknownIntValue = value.val; 
      this.UnknownIntKnown = value.known; 
     } 
    } 

} 

public struct UnknownInt 
{ 
    public readonly int Val; 
    public readonly bool Known; 

    public UnknownInt(int val, bool known) 
    { 
     this.Val = val; 
     this.Known = known; 
    } 

    public override string ToString() 
    { 
     return String.Format("{0} ({1})", 
      Val, Known == true ? "known" : "unknown"); 
    } 
    public override bool Equals(Object obj) 
    { 
     return obj is UnknownInt && this == (UnknownInt)obj; 
    } 
    public static bool operator ==(UnknownInt x, UnknownInt y) 
    { 
     return x.Val == y.Val && x.Known == y.Known; 
    } 
    public static bool operator !=(UnknownInt x, UnknownInt y) 
    { 
     return !(x == y); 
    } 

} 

기본적인 아이디어는 당신의 - 정의 유형을 저장하지만, 인텔리 (System.ComponentModel.EditorBrowsable 속성)에서 숨겨진 열을 것입니다. SubSonic의 단순 저장소에서 숨겨져있는 복잡한 유형 (이 경우 클래스보다는 구조체를 선호 함)보다 많습니다. 재정의 및 연산자 오버로드는 선택 사항이지만이 유형을 사용하면 더 쉽게 작업 할 수 있습니다.

사용 예제 :

// 1. Step Create item1 
var item1 = new Record(); 
item1.ID = 1; 
item1.UnknownInt = new UnknownInt(1, true); 

// 2. Setp Create item2 
var item2 = new Record(); 
item2.ID = 2; 
item2.UnknownImt = new UnknownInt(1, false); 

if (item1.UnknownInt == item2.UnknownInt) 
    Console.WriteLine("???"); 
else 
    Console.WriteLine("Profit!!!"); 
+0

불행히도 해결책으로 보입니다. 나는 덜 우아한 방식으로 문제를 해결했습니다. 그래도 좋은 답변이며 후손에게 좋습니다! – qdot

0

UnknownInt 클래스 대신 nullable int (int?)를 사용해보십시오 - 아음속을 사용하여 저장할 수 있습니다. XML 변환이 필요하지 않습니다!

+0

그것은 내가 찾고 있어요되지 어떤 불행하게도이다 (I 다른 곳에서 선택 System.Nullable 많이 사용하고 난이 알고 있어요)는 '널 (null)'값, 기본적으로 (즉, 통계 모델이 업데이트해야하는 것을보고하지 못하는 응답)을 나타내야합니다. '알 수 없음'답변이 유효한 답변 (즉, null이 아님) 인 경우 사용자는 질문을보고 대답하지 않은 채로 남겨두기로 결정했습니다. 허용되는 범위를 벗어난 정수 값을 창의적으로 사용하여 인코딩 할 수 있습니다 (본질적으로 연령 -1은 '알 수 없음'이고, 연령 -2는 등을 공유하지 않음). 그러나 이것은 우아하지 않습니다. – qdot