2011-01-09 4 views
6
에서 문자열로 열거를지도로

내 테이블 :어떻게 데이터베이스

create table MyTable (
    Id int identity(1,1) not null, 
    MyStatus char(2) not null 
) 
insert into MyTable(MyStatus) select 'A' 

클래스와 열거 :

public class MyTable 
{ 
    public virtual int Id { get; set; } 
    public virtual MyTableStatus MyStatus { get; set; } 
} 

public enum MyTableStatus 
{ 
    A, 
    B 
} 

매핑 : 나는 다음 테스트를 실행하면

public MyTableMap() 
{ 
    Id(x => x.Id); 
    Map(x => x.MyStatus); 
} 

, 내가 얻을 System.FormatException : 입력 문자열의 형식이 올바르지 않습니다 ...

[Test] 
public void Blah() 
{ 
    MyTable myTable = Session.Get<MyTable>(1); 
    Assert.That(myTable.MyStatus, Is.EqualTo(MyTableStatus.A)); 
} 

열거 형을 데이터베이스의 문자열 표현에 매핑하는 올바른 방법은 무엇입니까?

수정 - 다른 응용 프로그램에서도 사용하기 때문에 쉽게 수정할 수없는 기존 데이터베이스에 응용 프로그램을 쓰고 있습니다. 그래서 데이터베이스의 일부 필드 (응용 프로그램에서 열거 형으로 나타 내기를 원함)는 int 유형이고 char (2) 유형 중 일부입니다.

+0

다른 열거 형에 대해 문자열과 int를 사용하는 데이터베이스 작업을 포함하여 알고 싶습니다. (오직 int로 작업 한 경우에만) – Phill

답변

5

열거 형을 문자열 표현으로 변환하고 되돌리려면 사용자 지정 IUserType을 만들어야합니다. good example in C# hereexample in VB.NET for working with enums here이 있습니다 (IUserType 구현까지 아래로 스크롤).

+0

[EnumStringType] (https : // github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Type/EnumStringType.cs)이 작업을 수행합니다. 이것을 사용하는 예제는이 [질문] (http://stackoverflow.com/questions/335533/normalizing-enumstringtype-in-nhibernate)을 참조하십시오. – Darius

0

글쎄, 내가 아는 한 NHibernate는 기본적으로 db로만 문자열로 enum을 저장한다. 나는 여기에있는 문제가 무엇인지 알고 있다고 생각한다. 표를 만드는 방법이 잘못되었습니다.

Nhibernate를 사용하는 경우 구성 설정 기능을 사용하여 테이블을 수동으로 생성하는 대신 테이블을 생성하면 열거 형이 문자열로 저장된다는 것을 알 수 있습니다.

우리는 우리의 응용 프로그램에서 열거 형을 광범위하게 사용하며 db에 문자열로 저장할 수 있습니다. 그 이유는 열거 형 톰에 새 값을 추가하면 기본 값이 설정되지 않으면 내 코드와 데이터가 확실히 결합되지 않기 때문에 간단합니다.

SimpleConfig.ExposeConfiguration(c => new SchemaExport(c).Create(false, true)).BuildConfiguration(); 

또한 문자열 대신 char을 사용하면 속성에 varchar를 사용할 수 있습니다.

업데이트 후 : 데이터베이스에 저장하기 전에 어떤 종류의 조작을 할 수 있습니까? 따라서 새로운 char 열거 형을 저장하고자 할 때 int 값을 생성하고 이것을 등록 정보에 저장하고 지금 저장하는 함수를 작성하거나 간단하게 만들려면이 함수는 스위치 케이스를 가질 수 있습니다.

그렇다면 db에서 검색 한 속성을 사용하지 말고 대신 Status 클래스에 새 속성을 추가하십시오. 기본적으로 적절한 enum을 얻는 논리가 있습니다.

그 생각은 좋은 생각입니까?

희망이 도움이됩니다.

+0

나는 TINYINT로 Enum을 저장하는 것을 선호하지만, 내 문제는 VARCHAR로 저장되는 두 개의 값이 있다는 것입니다. 뉴 햄프셔지도 이러한 :(그래서 문자열 및 Int Enums 함께 사용하는 방법을 모르겠습니다. – Phill

+0

일부 '열거 형'int 및 일부 문자입니다. 내 질문 업데이트. – sventevit

관련 문제