2009-09-14 6 views
3
내가 NHibernate에

Enums 목록에 매핑 하시겠습니까?

사용하여 DB 테이블에 열거 형의 목록이 클래스를 매핑해야

여기 -------------- 객체

public class Driver : IIdentity 
{ 
    private IList<Licence> licences; 

    /// <summary> 
    /// The drivers licences 
    /// </summary> 
    public virtual IList<Licence> Licences 
    { 
     get 
     { 
      return this.licences; 
     } 
     set 
     { 
      this.licences = value; 
     } 
    } 
    ..... rest of the class .... 
} 

//the enum 
public enum Licence 
{ 
    FivePersonCar = 5, 
    SixPersonCar = 6 
} 

있습니다 - 여기 여기 ------------- DB를 테이블

TABLE [dbo].[DriverLicence]( [DriverId] [int] NOT NULL, [Level] [int] NOT NULL)

TABLE [dbo].[Driver]( [DriverId] [int] NOT NULL, [Name] [varchar](150) NULL)

이다 D에 대한 내 유창함지도입니다 강

public class DriverMap : ClassMap<Driver> 
{ 
    public DriverMap() 
    { 
     Id(x => x.Id).WithUnsavedValue(0).GeneratedBy.Identity(); 

     Map(x => x.Name); 

     HasManyToMany(x => x.Licences) 
      .WithTableName("DriverLicence") 
      .AsElement("Level").AsBag(); 


     HasManyToMany(x => x.InsuredToDrive) 
      .CollectionType<InsurancedList>() 
      .WithTableName("InsuredWith"); 
    } 

} 

는 -----이 다음 HBM 파일을 생성

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access=""> 
    <class name="Taxi.DomainObjects.Driver, Taxi.DomainObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Driver`" xmlns="urn:nhibernate-mapping-2.2"> 
    <id name="Id" type="Int32" unsaved-value="0" column="DriverID"> 
     <generator class="identity" /> 
    </id> 
    <property name="Name" type="String"> 
     <column name="Name" /> 
    </property> 
    <bag name="Licences" table="DriverLicence"> 
     <key column="DriverId" /> 
     <many-to-many column="LicenceId" class="Taxi.DomainObjects.Licence, Taxi.DomainObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </bag> 
    <bag name="InsuredToDrive" collection-type="Taxi.DomainObjects.Collections.InsurancedList, Taxi.DomainObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="InsuredWith"> 
     <key column="DriverId" /> 
     <many-to-many column="CarId" class="Taxi.DomainObjects.Car, Taxi.DomainObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </bag> 
    </class> 
</hibernate-mapping> 
여기

내 오류가

"테이블 DriverLicence에서 연관이 매핑되지 않은 클래스를 의미한다 : Taxi.DomainObjects.Licence "

아무도 내가 잘못하고있는 것을 알고 있습니까?

답변

5

열거 형은 NHibernate에 의해 기본 유형으로 간주되므로 many-to-many을 사용하여 attribute으로 매핑하면 안됩니다. 이 같은 HBM 매핑 당신이 긴 type 속성을 생략 할 수 있습니다

<bag name="Licences" table="DriverLicence"> 
    <key column="DriverId" /> 
    <element column="LicenceId" type="Taxi.DomainObjects.Licence, Taxi.DomainObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> 
</bag> 

있지만 : .hbm 측면에서, 당신은 이런 식으로 뭔가를해야 할 것입니다. 내 유창한 문법은 그리 좋지 않아서 내가 두려워 할 때 당신을 도울 수 없다. This question가 도움이 될 수 있습니다.

+2

hasMany의 (X => x.Licences) .WithTableName ("DriverLicence") .AsElement ("레벨")를 떠났다.AsBag(); – dbones

0

정확히 이것은 내가 묻는 것입니다. here. 내 주위를 둘러 보면서 어떻게 작동하는지 파악할 수 없었기 때문에 일종의 해결 방법을 수행해야했습니다.

다른 것을 (이 경우 내가 LicenseCode를 사용합니다)에 라이센스 클래스 이름을 변경

다음 라이센스라는 개체를 만듭니다

내가 코드에 무슨 짓을했는지 번역합니다. 이 물건은 적어도 내 경우에는 ID와 이름이있다. id는 실제로 Enum에 할당 된 정수 값입니다. 원한다면 동일한 방식으로 열거 형의 이름을 사용할 수 있습니다. 아래 코드를 변경하여 ID 대신 이름을 변환하십시오. 클래스에서, 같은 속성을 추가 :

public virtual LicenseCode LicenseCode 
{ 
    get 
    { 
     return (LicenseCode)LicenseId; 
    } 
} 

을 그런 다음이 객체 (ID와 이름)를 위해 저장 될 데이터와 일치하는 테이블을 생성

그런 매핑을 만듭니다. ID와 이름 만 매핑하면됩니다.

+0

덕분에, 난 당신의 게시물에 대답 좋은 링크 – dbones

0

Enum 클래스에서 Flags 속성을 사용하는 대신 그 목록을 사용 해본 적이 있습니까? 답변에 대한

+0

안녕하세요, 당신이 무슨 뜻인지 모르겠다, 나는 드라이버 (이것은 데모 애플 리케이션)에 대한 라이센스 (열거)의 목록을 원했습니다. Enum (라이센스)에서 플래그가 어떻게 대체 될 수 있습니까? 메신저가 사용하는 구현 된 시나리오보다 낫다면 알려주십시오. 그렇지 않으면 주요 쟁점이 해결되었습니다. – dbones