2008-10-28 4 views
12

Oracle 데이터베이스가 있고 필드 중 하나가 날짜 범위 필드입니다. 기본적으로 YYYY/MM/DD-YYYY/MM/DD 형식의 VARCHAR (40)로 데이터베이스에 저장됩니다. nHibernate에서 이처럼 만든 커스텀 클래스에 매핑하고 싶습니다.nHibernate를 사용자 정의 유형으로 매핑

public class DateTimeRange 
{ 
    public DateTimeRange(DateTime fromTime, DateTime toTime) 
    { 
     FromTime = fromTime; 
     ToTime = toTime; 
    } 

    public override string ToString() 
    { 
     return String.Format("{0} to {1}", FromTime.ToString("HH:mm:ss"), ToTime.ToString("HH:mm:ss")); 
    } 

    public DateTime FromTime { get; set; } 

    public DateTime ToTime { get; set; } 
} 

어떻게 이런 사용자 정의 클래스에 매핑 할 수 있습니까?

답변

17

사용자 고유의 IUserType을 구현해야합니다.

자세한 내용은 blog post을 참조하십시오. 블로그가 사라질 경우를 대비하여 관련 섹션을 붙여 넣습니다.

NHibernate에서 사용자 지정 매핑 형식은 IUserType 또는 ICompositeUserType 인터페이스에서 파생되는 클래스입니다. 이 인터페이스에는 구현해야하는 몇 가지 메소드가 포함되어 있지만 여기서 우리는 두 가지 메소드에 중점을 둘 것이다. 다음을 고려하세요.

public class TypeClassUserType : IUserType 
    { 


    object IUserType.NullSafeGet(IDataReader rs, 
     string[] names, 
    object owner) { 

    string name = NHibernateUtil.String.NullSafeGet(rs, 
    names[0]) as string; 

    TypeClassFactory factory = new TypeClassFactory(); 
    TypeClass typeobj = factory.GetTypeClass(name); 
    return typeobj; 
    } 

    void IUserType.NullSafeSet(IDbCommand cmd, 
    object value, 
    int index) { 

     string name = ((TypeClass)value).Name; 
    NHibernateUtil.String.NullSafeSet(cmd, name, index); 
    } 
    } 

이 클래스를 생성하는 데, 지금은 명시 적으로 ActualClass 매핑에 대한 간단한 속성으로 ActualClass와 TypeClass 사이의 관계를 매핑 할 수 있습니다. NHibernate에이 ActualType의 인스턴스를 저장하는 과정에 따라

<property 
    name="Type" 
    column="TypeName" 
    type="Samples.NHibernate.DataAccess.TypeClassUserType, 
     Samples.NHibernate.DataAccess" /> 

, 그것은로드 TypeClassUserType의 새로운 인스턴스를 생성하고 NullSafeSet 메소드를 호출합니다. 메서드 본문에서 볼 수 있듯이 매핑 된 속성 (value 매개 변수로 전달 된)에서 이름을 추출하고 추출 된 이름을 데이터베이스에 설정할 매개 변수의 값으로 설정합니다. 최종 결과는 ActualClass의 Type 속성이 도메인 모델의 TypeClass이지만 TypeClass 개체의 Name 속성 만 데이터베이스에 저장된다는 것입니다. 그 반대도 마찬가지입니다. NHibernate가 데이터베이스에서 ActualType의 인스턴스를로드하고 사용자 정의 매핑 유형의 속성을 찾으면 사용자 정의 유형을로드하고 NullSafeGet 메소드를 호출합니다. 보시다시피, 내 메소드는 반환 된 데이터에서 이름을 가져오고 플라이급 팩토리를 호출하여 TypeClass의 올바른 인스턴스를 가져온 다음 실제로 해당 인스턴스를 반환합니다. 형식 확인 프로세스는 내 데이터 액세스 클래스 (심지어 그 문제에 대해서도 NHibernate 자체)에 투명하게 발생합니다.

+0

안녕하세요, SoftwareJedi, 게시물에 언급 된 링크를 확인 하시겠습니까? 발견되지 않았습니다. 가능한 링크를 제공해 주시겠습니까? 감사. –

+0

답변에서 링크를 삭제했습니다. 나는 다른 링크가 없으며 관련 섹션을 답변의 본문에 넣었 기 때문에 링크가 끊어지기까지했습니다. – TheSoftwareJedi

+0

https://web.archive.org/web/20100516024604/http://blogs.msdn.com/howard_dierking/archive/2007/04/23/nhibernate-custom-mapping-types.aspx –