문제

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를 구축합니다. 즉, 각 속성에 대해 자신의 사용자 유형 포장지를 제공하면 트릭이됩니다.

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