2

제목이 묻습니다. 데이터베이스에는 "제목 홀더"와 같은 공백이있는 문서의 제목을 포함하는 기존 데이터가 있습니다. 나는 이것을 Fluent NHibernate로 열거 형에 직접 매핑 할 수 있기를 원하지만 구문 분석 오류가 발생했습니다. 내가 사용할 수있는 사용자 지정 변환기에 대한 표시를 찾을 수 없었습니다. 다른 사람이 만들 수있는 권장 사항이 있습니까?FluentNHibernate가있는 enum에 공백이있는 varchar를 매핑 할 수 있습니까

내 매핑은 다음과 같습니다.

Map(x => x.DocumentName).Nullable().CustomSqlType("varchar(50)"); 

답변

2

아래의 예 당신은 당신의 자신의 NHibernate에 IUserType을 구현해야하기 위하여려고하고 논리의 대부분은 NullSafeGet()와 NullSafeSet() 메소드에있을 것입니다.

문자열 매핑에 대한 내부적 인 열거 형을 직접 만들어야합니다. 문자열을 키로, 열거 형 값을 값으로 가질 수있는 사전을 사용할 수 있습니다. 따라서 논리는 기본적으로 문자열에서 열거 형으로 또는 그 반대로 변환하기 위해 해당 사전의 값을 검색하는 방식으로 회전합니다. 또 다른 옵션은 각 enum 값을 문자열 버전으로 꾸미기 위해 애트리뷰트를 사용하는 것입니다. 그러면 리플렉션을 통해 변환을 수행합니다 ...

다음은 사용자 정의 IUserType을 작성하는 몇 가지 예입니다. 아래 링크 정말) 올바른 방향을 가리켜 야합니다

+0

데이터에 따라 IUserType 내의 밑줄에 공백을 바꿀 수 있습니다 – dotjoe

1

이 데이터를 데이터베이스에서 읽을 때 공백을 없애는 사용자 정의 유형을 작성할 수 있습니다 그리고 당신은 열거로 변환 된 문자열을 매핑 할 수 있습니다. 이 접근법의 문제점은 공간을 다시 추가 할 위치를 알 수 없으므로 데이터를 데이터베이스에 다시 저장할 때입니다 (공백을 삽입 할 위치를 추적하기 위해 스파게티 코드가 만족스럽지 않은 경우).

또는 데이터베이스에 매핑 된 속성을 기반으로 열거 형을 반환하는 enum 유형의 클래스에 추가 속성을 가질 수 있습니다.

public class Document 
{ 

    public virtual string DocumentName {get; set;} 

    public EDocumentName Name 
    { 
     get 
     { 
      if (DocumentName == "Title Holder") 
      { 
       return EDocumentName.TitleHolder; 
      } 
     } 
     set 
     { 
      if(value == EDocumentName.TitleHolder) 
      { 
       DocumentName = "Title Holder"; 
      } 
     } 
    } 
} 

public enum EDocumentName 
{ 
    TitleHoldder 
} 
관련 문제