Карта к списку Enums? - PullRequest
       18

Карта к списку Enums?

3 голосов
/ 15 сентября 2009

Мне нужно сопоставить класс, у которого есть список Enums, с таблицей БД, используя NHibernate

вот объекты

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
}

---------------- вот таблица БД

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

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

------------- Вот моя беглая карта для водителя

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»

кто-нибудь знает, что я делаю не так?

Ответы [ 3 ]

5 голосов
/ 15 сентября 2009

Перечисления считаются примитивным типом NHibernate, поэтому вам не следует отображать, используя many-to-many с классом attribute. В терминах .hbm вам понадобится что-то вроде этого:

<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 вы можете опустить атрибут long type. Мой свободный синтаксис не очень хорош, поэтому я не могу вам помочь, я боюсь. Этот вопрос может помочь в дальнейшем.

0 голосов
/ 16 сентября 2009

Рассматривали ли вы использовать атрибут Flags с вашим классом enum вместо того, чтобы иметь их список?

0 голосов
/ 15 сентября 2009

Это именно то, что я спросил здесь . Из-за того, что я играл, я не мог понять, как заставить это работать, поэтому мне пришлось сделать своего рода обходной путь.

чтобы перевести то, что я сделал, в ваш код:

Измените имя класса вашей лицензии на другое (в этом случае я буду использовать LicenseCode), а затем создайте объект с именем License. Этот объект, по крайней мере, в моем случае, имеет идентификатор и имя. Идентификатор - фактически целочисленное значение, назначенное в моем Enum. Вы можете использовать имя перечисления таким же образом, если хотите, и просто изменить код ниже, чтобы перевести имя вместо идентификатора. В классе добавьте свойство, подобное этому:

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

Затем создайте таблицу, соответствующую данным, которые вы будете хранить для этого объекта (идентификатор и имя)

Затем создайте отображение. Это будет просто, так как вы указываете только Id и имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...