2011-04-11 4 views
6

나는 메시지 형식이 전자 메일인지 또는 Sms인지를 나타내는 열거 형을 가진 클래스가 있습니다. 열거 형이 정의 :SQL Server NHibernate - int 매핑을 열거

public enum ReminderType 
{ 
    Email = 1, 
    Sms = 2 
} 

이 유형을 활용 클래스 보이는 같은 :

public class Reminder : EntityBase 
{ 
    public virtual string Origin { get; set; } 
    public virtual string Recipient { get; set; } 
    public virtual ReminderType Type { get; set; } 
    public virtual Business Business { get; set; } 
    public virtual DateTime Created { get; set; } 

    public Reminder() 
    { 
     Created = DateTime.UtcNow; 
    } 
} 

내가 그러나 데이터베이스에 입력 알림의 엔티티를 유지하려고, 나는 다음과 같은 오류가 발생합니다 :

System.Data.SqlClient.SqlException (0x80131904): Conversion failed when converting the nvarchar value 'Email' to data type int. 

백킹 필드 유형 int이다, 그래서 NHibernate에 기본적으로 문자열 표현을지도하려고하는 이유를 모르겠어요. 나는 유창함 자 NHibernate를 사용하고,하고 관련 매핑 코드는 다음과 같습니다

mappings.Override<Reminder>(map => 
{ 
    map.Map(x => x.Type).Column("Type") 
}); 

나는 자 NHibernate의 기본 동작의 int로 열거를 매핑하는 것입니다 확신 해요, 그래서 왜이 경우에는 그렇게되지 않는 이유는 무엇입니까? SQL Server 2005를 사용하고 있습니다. 내가 같은 일을하고 있고 그렇게처럼 작동있어

+0

전자 메일은 Type 속성의 문자열 값입니다. Nhibernate는 정수 값 1로 저장하려고 시도하지만 대신 'Email'문자열을 저장하려고하므로 오류가 발생합니다. 왜 그렇게하고 있는지 모르겠지만 ... – Chris

+0

http://stackoverflow.com/questions/439003/how-do-you-map-an-enum-as-an-int-value-with-fluent- nhibernate – dotjoe

+0

또는 http://stackoverflow.com/questions/1483044/mapping-enum-with-fluent-nhibernate –

답변

3

입니다 자신의 의견이나 답변을 삭제했지만 제공 한 링크()가 내 질문에 대한 답변입니다. 나는 대회 전체 타격 클래스 정의에 가지 않기로 선택한 것이 아니라, 매핑 코드 인라인 대회,과 같이 :

var mappings = AutoMap.AssemblyOf<Business>() 
    .Where(x => x.IsSubclassOf(typeof(EntityBase))) 
    .IgnoreBase(typeof(EntityBase)) 
    .Conventions.Add 
    (
     ConventionBuilder.Id.Always(x => x.GeneratedBy.Identity()), 
     ConventionBuilder.HasMany.Always(x => x.Cascade.All()), 
     ConventionBuilder.Property.Always(x => x.Column(x.Property.Name)), 
     Table.Is(o => Inflector.Pluralize(o.EntityType.Name)), 
     PrimaryKey.Name.Is(o => "Id"), 
     ForeignKey.EndsWith("Id"), 
     DefaultLazy.Always(), 
     DefaultCascade.All(), 

     ConventionBuilder.Property.When(
      c => c.Expect(x => x.Property.PropertyType.IsEnum), 
      x => x.CustomType(x.Property.PropertyType)) 
    ); 

마지막 대회 빌더 문은 트릭을했다. 나는 Fluent NHibernate의 기본값이 enum을 문자열로 매핑하는 이유에 대해 궁금합니다. 그건별로 의미가없는 것처럼 보입니다.

+1

enum을 int로 매핑하면 enum을 정의한 해당 앱만이 db에서 의미하는 것을 인식합니다. 데이터베이스의 마법 번호와 같습니다. – dotjoe

+0

코드를 다시 읽은 후 실수를했는데 주석이 적절하지 않았고 두 번째 코드가 분명해 보였기 때문에 첫 번째 주석을 삭제했습니다. 첫 번째 구글 안타 중 하나가 당신이 이미 그것을 보았다고 생각했습니다. – R0MANARMY

+0

@dotjoe : 합리적인 것 같습니다. 이전 버전의 라이브러리와는 반대쪽 (문자열 대신 기본적으로 int로 매핑 됨) 작업을 수행 했으므로이 동작 변경으로 인해 나타나기 시작하는 데 엄청난 혼란이있었습니다. – Chris

5

... 내 경우 EmployeeType에서

는이 사람이 다음 게시 및 유지 이유를 모르겠어요 열거 클래스

Map(x => x.EmployeeType, "EmployeeType_Id").CustomType(typeof (EmployeeType)); 
+0

재산 관련 기준에 따라 작업하고 싶다면 완벽 할 것입니다. – Chris

0

절대로 NHibernate에서 Enum을 int로 매핑하면 안됩니다. ghost updates을 갖는 이유가됩니다.

XML 매핑에서 형식 속성을 설정하지 않는 것이 가장 좋은 방법입니다. 이를 위해 Fluent NHibernate에서 .CustomType(string.Empty)을 사용할 수 있습니다.

추가 정보는 here입니다.

관련 문제