nhibernate compositeUserType : SQL 유형을 지정하는 방법은 무엇입니까?
-
21-08-2019 - |
문제
NH 2.0을 사용하면 사용자 정의 유형이 있습니다. 4 가지 속성으로 구성되어 있으므로 구현했습니다. ICompositeUserType
.
문자열과 소수점 속성의 길이와 정밀도를 지정하고 싶습니다. 사용자 유형 내에서 매핑 파일의 모든 사용에 따라 지정하지 않도록하십시오.
그러나 단지 a PropertyTypes
Itype을 반환하는 구현 속성. 재미있는 것은, IUserType
a SqlTypes
재산,ICompositeUserType
하지 않습니다.
- 두 인터페이스를 모두 구현해야합니까?
- 지정하려는 각 SQL 유형을 랩핑하려면 사용자 유형을 구현해야합니까?
- 또는 복합 사용자 유형의 SQL 유형을 어떻게 지정할 수 있습니까?
정말 감사합니다.
해결책 2
솔루션을 찾았는데 매우 간단합니다. 나는 그것을 사용하여 nhibernate 유형을 만들어야합니다 TypeFactory
:
public IType[] PropertyTypes
{
get
{
return new []
{
TypeFactory.GetDecimalType(36, 18),
TypeFactory.GetStringType(100)
}
}
}
다른 팁
이 유형의 파기 (NH 2.0)에 대한 소스 코드를 다운로드하는 것이 좋습니다.
먼저 Itype 인스턴스를 빌드하는 intectionclory.heuristicType 메소드를 살펴보십시오.
...
else if (typeof(ICompositeUserType).IsAssignableFrom(typeClass))
{
type = new CompositeCustomType(typeClass, parameters);
}
else if (typeof(IUserType).IsAssignableFrom(typeClass))
{
type = new CustomType(typeClass, parameters);
}
...
따라서 사용자 정의 유형이 icompositeUserType을 구현하면 compositecustomType 클래스로 인스턴스화됩니다. 이는 ICOMPOSITEUSERTYPE 및 IUSERTYPE 인터페이스를 모두 구현할 수있는 가능성을 제거합니다.
이제 compositecustomType를 살펴 보겠습니다
public override SqlType[] SqlTypes(IMapping mapping)
{
IType[] types = userType.PropertyTypes;
SqlType[] result = new SqlType[GetColumnSpan(mapping)];
int n = 0;
for (int i = 0; i < types.Length; i++)
{
SqlType[] sqlTypes = types[i].SqlTypes(mapping);
for (int k = 0; k < sqlTypes.Length; k++)
{
result[n++] = sqlTypes[k];
}
}
return result;
}
따라서 유형을 PropertyTypes에서 반환하고 각 속성에 대한 SQLType를 구축합니다. 즉, 각 속성에 대해 자신의 사용자 유형 포장지를 제공하면 트릭이됩니다.
제휴하지 않습니다 StackOverflow