2009-06-30 5 views
3

일종의 유형 변환을 수행하고 System.Drawing.Color에 직접 매핑 할 수 있습니까? 색상을 html/css 값으로 저장합니다. 즉 #ffffff입니다. IUserType을 구현하는 사용자 지정 형식을 만들 필요가 없습니다.이 형식은 System.Drawing.Color의 래퍼입니다.Hibernate에서 System.Drawing.Color로 매핑

+0

왜 사용자 유형을 생성하지 않으시겠습니까? 그것은 당신이하려고하는 것을 정확히 수행합니다 ... –

+0

David - 그 이유는 이미 사용할 수있는 System.Drawing.Color 유형이 있기 때문입니다. 그 유형을 다시 만드는 이유는 무엇입니까? –

+2

Hibernate 사용자 타입은 그 타입을 대체하지 않고 단지 데이터베이스 필드를 그 타입으로 변환하는 로직을 구현하는 것일 뿐이다. 형식을 사용하여 매핑하고 데이터베이스에 문자열을 저장하면 속성을 System.Drawing.Color로 노출합니다. 코드 게시 ... –

답변

6

크기를 사용해보십시오. NHibernate 사용자 유형은 노출하고자하는 유형을 대체하지 않고 단순히 저장된 데이터베이스 유형에서 .NET 유형 (여기서는 문자열에서 색상으로, 그 반대로)에서 자동으로 매핑하는 메커니즘을 제공합니다.

public class ColorUserType : IUserType 
{ 
    public bool Equals(object x, object y) 
    { 
     if (ReferenceEquals(x, y)) return true; 
     if (x == null || y == null) return false; 
     return x.Equals(y); 
    } 

    public int GetHashCode(object x) 
    { 
     return x == null ? typeof(Color).GetHashCode() + 473 : x.GetHashCode(); 
    } 

    public object NullSafeGet(IDataReader rs, string[] names, object owner) 
    { 
     var obj = NHibernateUtil.String.NullSafeGet(rs, names[0]); 
     if (obj == null) return null; 
     var colorString = (string)obj; 
     return ColorTranslator.FromHtml(colorString); 
    } 

    public void NullSafeSet(IDbCommand cmd, object value, int index) 
    { 
     if (value == null) 
     { 
      ((IDataParameter)cmd.Parameters[index]).Value = DBNull.Value; 
     } 
     else 
     { 
      ((IDataParameter)cmd.Parameters[index]).Value = ColorTranslator.ToHtml((Color)value); 
     } 

    } 

    public object DeepCopy(object value) 
    { 
     return value; 
    } 

    public object Replace(object original, object target, object owner) 
    { 
     return original; 
    } 

    public object Assemble(object cached, object owner) 
    { 
     return cached; 
    } 

    public object Disassemble(object value) 
    { 
     return value; 
    } 

    public SqlType[] SqlTypes 
    { 
     get { return new[] {new SqlType(DbType.StringFixedLength)}; } 
    } 

    public Type ReturnedType 
    { 
     get { return typeof(Color); } 
    } 

    public bool IsMutable 
    { 
     get { return true; } 
    } 
} 

다음 매핑은 다음 작동합니다 :

<property 
    name="Color" 
    column="hex_color" 
    type="YourNamespace.ColorUserType, YourAssembly" /> 
완성도를 들어

, 감사를 조쉬이 들어, FluentNHibernate를 사용하는 경우, 당신은 다음과 같이 매핑 할 수 있습니다

Map(m => m.Color).CustomTypeIs<ColorUserType>(); 
+0

이것은 실제로 잘 작동합니다. 네이티브 형식을 사용할 수 있다는 것을 알지 못하고 IUserType 구현으로 매핑합니다. 내 POCO의 유형으로 IUserType 구현을 사용해야한다고 생각했습니다. 감사! –

+0

David, "NHibernate 사용자 유형이 그 유형을 대체하지 않습니다 ..."라는 답변을 업데이트 할 수 있습니까? 또한이 작업과 매핑 할 수도 있습니다. 나는 이것이 행동이라는 것을 깨닫지 못하는 나 같은 사람들이 더있을 것이라고 확신한다. 이전에 IUserType을 사용했지만 형식이 완전히 사용자 지정되었습니다. –

+0

완료했으나 매핑이 메모리에서 발생했습니다. 작동하지 않으면 알려주세요! –

0

나는 이런 식으로 할 것 :

나는 내 수업에서 개인 문자열 속성 또는 필드를 작성하고 당신이 당신의 데이터베이스에 색상을 저장하는 데 사용할 열이 속성/필드를 매핑한다.

그런 다음 Color를 반환하는 클래스의 public 속성을 만들고 해당 속성의 getter에서 개인 필드/속성에 저장된 문자열을 Color로 변환하고 setter를 사용하여 문자열 필드/속성을 주어진 Color 값에 해당하는 값으로 설정합니다.

public class MyEntity 
{ 

    private string htmlColorString; 

    public Color TheColor 
    { 
     get { return System.Drawing.ColorTranslator.FromHtml (htmlColorString); } 
     set 
     { 
       htmlColorString = System.Drawing.ColorTranslator.ToHtml(value); 
     } 
    } 

} 
+0

16 진수를 RGB로 변환 한 다음 Color.FromArgb() 메서드를 사용할 수 있습니다. –

+0

그게 실제로 내가 현재하고있는 것입니다. 변환을 수행하는 방법은 System.Drawing.ColorTranslator입니다.FromHtml (문자열 "#ffffff") 및 System.Drawing.ColorTranslator.ToHtml (색상 myColor). 유형 변환을 수행하는 기본 제공 방법이 없다는 것을 확인할 수 있습니까? –

0

내가 프레데릭의 구현 방식에 가서 다음과 같이 변환 할 것 : RGB에

변환 진수 - 16 진수 값의 각 쌍은 RGB 구성 요소 중 하나입니다 - # 23FF00은 R = 23을 의미한다 , G = FF, B = 00이다.

일부 문자열이 16 진수 값에 구문 분석 할 후에이는 RGB의 각 구성 요소에 대해 당신에게 int 값을 줄 것이다 : 그 후

int.Parse("FF", System.Globalization.NumberStyles.AllowHexSpecifier); 

, 단순히 전화 정적 Color.FromArgb()와 당신 ' 당신의 색을 가질 수 있습니다.

+1

내장 된 색상 변환기 System.Drawing.ColorTranslator가 있습니다. –

2

IUserType 구현을 작성하여 색상 속성과 직접 변환하는 데 15 분이 걸리므로 마법 속성을 배치 할 필요가 없습니다.

이 또한 색상이 문제가되지 않을 수 있지만 당신이, 당신이 마법 속성을 함께 할 수 없을 것 HQL 또는 Linq에, 당신의 컬러 속성을 사용할 수있는 이점이있다 http://www.lostechies.com/blogs/rhouston/archive/2008/03/23/mapping-strings-to-booleans-using-nhibernate-s-iusertype.aspx

를 참조하십시오.

관련 문제