문제

Oracle 데이터베이스가 있고 필드 중 하나는 날짜 범위 필드입니다. 기본적으로 데이터베이스에 yyyy/mm/dd-yyyy/mm/dd 형식의 varchar (40)로 저장됩니다. 나는 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; }
}

이와 같은 커스텀 클래스에 어떻게 매핑 할 수 있습니까?

도움이 되었습니까?

해결책

자신의 iusertype를 구현해야합니다.

이것 좀 봐 블로그 게시물 자세한 내용은. 블로그가 사라질 경우 아래에 관련 섹션을 붙여 넣을 것입니다.

nhibernate에서 사용자 정의 매핑 유형은 iusertype 또는 icompositeUserType 인터페이스에서 파생되는 클래스입니다. 이 인터페이스에는 구현 해야하는 몇 가지 방법이 포함되어 있지만 여기서 목적을 위해 우리는 그 중 2 개에 중점을 둘 것입니다. 다음을 고려하세요.

  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);
    }
  }

이 클래스를 만들었으므로 이제 실제 클래스와 타입 클래스 간의 연관성을 실제 클래스 매핑의 간단한 속성으로 명시 적으로 매핑 할 수 있습니다.

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

nhibernate가 실제 유형의 인스턴스를 저장하는 과정에 있으므로 typeclassuserType의 새로운 인스턴스를로드하고 생성하고 NullSafeset 메소드를 호출합니다. 메소드 본문에서 볼 수 있듯이, 매핑 된 속성에서 이름을 추출하고 (값 매개 변수로 전달됨) 추출 된 이름을 데이터베이스에서 설정할 매개 변수의 값으로 설정합니다. 순 결과는 실제 클래스의 유형 속성이 도메인 모델에서 타입 클래스이지만 typeClass 객체의 이름 속성 만 데이터베이스에 저장됩니다. 대화도 마찬가지입니다. nhibernate가 데이터베이스에서 실제 유형 인스턴스를로드하고 사용자 정의 매핑 유형의 속성을 찾으면 사용자 정의 유형을로드하고 nullSafeget 메소드를 호출합니다. 보시다시피, 내 메소드는 반환 된 데이터에서 이름을 가져오고 내 Flyweight Factory에 전화하여 OffeClass의 올바른 인스턴스를 얻은 다음 실제로 해당 인스턴스를 반환합니다. 유형 해상도 프로세스는 내 데이터 액세스 클래스 (그리고 그 문제에 대해 자체적으로 자체적으로)에 투명하게 발생합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top