사용자 고유의 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 자체)에 투명하게 발생합니다.
안녕하세요, SoftwareJedi, 게시물에 언급 된 링크를 확인 하시겠습니까? 발견되지 않았습니다. 가능한 링크를 제공해 주시겠습니까? 감사. –
답변에서 링크를 삭제했습니다. 나는 다른 링크가 없으며 관련 섹션을 답변의 본문에 넣었 기 때문에 링크가 끊어지기까지했습니다. – TheSoftwareJedi
https://web.archive.org/web/20100516024604/http://blogs.msdn.com/howard_dierking/archive/2007/04/23/nhibernate-custom-mapping-types.aspx –