일종의 유형 변환을 수행하고 System.Drawing.Color에 직접 매핑 할 수 있습니까? 색상을 html/css 값으로 저장합니다. 즉 #ffffff입니다. IUserType을 구현하는 사용자 지정 형식을 만들 필요가 없습니다.이 형식은 System.Drawing.Color의 래퍼입니다.Hibernate에서 System.Drawing.Color로 매핑
답변
크기를 사용해보십시오. 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>();
이것은 실제로 잘 작동합니다. 네이티브 형식을 사용할 수 있다는 것을 알지 못하고 IUserType 구현으로 매핑합니다. 내 POCO의 유형으로 IUserType 구현을 사용해야한다고 생각했습니다. 감사! –
David, "NHibernate 사용자 유형이 그 유형을 대체하지 않습니다 ..."라는 답변을 업데이트 할 수 있습니까? 또한이 작업과 매핑 할 수도 있습니다. 나는 이것이 행동이라는 것을 깨닫지 못하는 나 같은 사람들이 더있을 것이라고 확신한다. 이전에 IUserType을 사용했지만 형식이 완전히 사용자 지정되었습니다. –
완료했으나 매핑이 메모리에서 발생했습니다. 작동하지 않으면 알려주세요! –
나는 이런 식으로 할 것 :
나는 내 수업에서 개인 문자열 속성 또는 필드를 작성하고 당신이 당신의 데이터베이스에 색상을 저장하는 데 사용할 열이 속성/필드를 매핑한다.
그런 다음 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);
}
}
}
16 진수를 RGB로 변환 한 다음 Color.FromArgb() 메서드를 사용할 수 있습니다. –
그게 실제로 내가 현재하고있는 것입니다. 변환을 수행하는 방법은 System.Drawing.ColorTranslator입니다.FromHtml (문자열 "#ffffff") 및 System.Drawing.ColorTranslator.ToHtml (색상 myColor). 유형 변환을 수행하는 기본 제공 방법이 없다는 것을 확인할 수 있습니까? –
내가 프레데릭의 구현 방식에 가서 다음과 같이 변환 할 것 : RGB에
변환 진수 - 16 진수 값의 각 쌍은 RGB 구성 요소 중 하나입니다 - # 23FF00은 R = 23을 의미한다 , G = FF, B = 00이다.
일부 문자열이 16 진수 값에 구문 분석 할 후에이는 RGB의 각 구성 요소에 대해 당신에게 int 값을 줄 것이다 : 그 후
int.Parse("FF", System.Globalization.NumberStyles.AllowHexSpecifier);
, 단순히 전화 정적 Color.FromArgb()와 당신 ' 당신의 색을 가질 수 있습니다.
내장 된 색상 변환기 System.Drawing.ColorTranslator가 있습니다. –
IUserType 구현을 작성하여 색상 속성과 직접 변환하는 데 15 분이 걸리므로 마법 속성을 배치 할 필요가 없습니다.
이 또한 색상이 문제가되지 않을 수 있지만 당신이, 당신이 마법 속성을 함께 할 수 없을 것 HQL 또는 Linq에, 당신의 컬러 속성을 사용할 수있는 이점이있다 http://www.lostechies.com/blogs/rhouston/archive/2008/03/23/mapping-strings-to-booleans-using-nhibernate-s-iusertype.aspx
를 참조하십시오.
- 1. System.Windows.Media.Color를 System.Drawing.Color로 변환
- 2. Hibernate에서 n 개의 테이블을 1 개의 클래스로 런타임 단방향 매핑
- 3. MySQL의 Java/Hibernate에서 BigDecimal을 매핑 할 유형은 무엇입니까?
- 4. Hibernate에서 Null과 빈 콜렉션
- 5. Hibernate에서 콜렉션을 가진 어노테이션
- 6. C#에서 Excel.Range.Interior.Color를 System.Drawing.Color로 변환하는 방법?
- 7. .NET - 색상 이름 문자열을 System.Drawing.Color로 변환
- 8. Hibernate에서 createCriteria() 결과를 얻는다.
- 9. Hibernate에서 일반 DAO 패턴
- 10. Hibernate에서 Ehcache API 사용하기
- 11. XML 매핑에서 프로퍼티로 Hibernate에서 시퀀스를 사용하는 방법
- 12. Hibernate에서 엔티티 ID를 참조로 사용하기
- 13. Hibernate에서 삭제를 케스케이드하는 방법은 무엇입니까?
- 14. Hibernate에서 스키마 문제를 해결하는 방법?
- 15. Hibernate에서 뷰를 조인 테이블로 사용
- 16. Hibernate에서 시퀀스를 생성하고 읽는 방법?
- 17. Hibernate에서 사용되는 AttributeOverride 어노테이션은 무엇입니까?
- 18. Hibernate에서 "unique together"제한 지정하기
- 19. Hibernate에서 Java Map을 통해 이름, 값 쌍을 반환하는 방법 (매핑 파일 사용)
- 20. 자동 테스트를 깨지 않고 Hibernate에서 같은 테이블의 테이블과 뷰를 매핑 할 수 있습니까?
- 21. Hibernate에서 컴포넌트 콜렉션을 대량으로 삽입 하시겠습니까?
- 22. Hibernate에서 1 대 다수의 단방향 관계를 올바르게 구현하기
- 23. Hibernate에서 Get, Update, Insert, Delete 연산을위한 HQL이 필요하지 않은가?
- 24. 다차원 매핑 NHibernate 매핑
- 25. 매핑 및 역방향 매핑
- 26. 매핑
- 27. Hibernate에서 AnnotationConfiguration을 가진 알 수없는 엔티티 문제가 발생했습니다.
- 28. Hibernate에서 연결 해제 모드를 지정하는 방법?
- 29. Hibernate에서 서브 쿼리로부터 값을 얻는 방법 '
- 30. EJB 3.0와 다른 Hibernate에서 제공하는 지속성
왜 사용자 유형을 생성하지 않으시겠습니까? 그것은 당신이하려고하는 것을 정확히 수행합니다 ... –
David - 그 이유는 이미 사용할 수있는 System.Drawing.Color 유형이 있기 때문입니다. 그 유형을 다시 만드는 이유는 무엇입니까? –
Hibernate 사용자 타입은 그 타입을 대체하지 않고 단지 데이터베이스 필드를 그 타입으로 변환하는 로직을 구현하는 것일 뿐이다. 형식을 사용하여 매핑하고 데이터베이스에 문자열을 저장하면 속성을 System.Drawing.Color로 노출합니다. 코드 게시 ... –