映射到枚举列表?(Map to a list of Enums?)

2019-08-06 04:03发布

我需要地图具有枚举的列表,以一个数据库表类,使用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”

任何人都知道什么即时做错了什么?

Answer 1:

枚举被认为是一种最原始的由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映射可以省略长type属性。 我流利的语法不是很好,所以我不能帮你那里,我很害怕。 这个问题可以进一步帮助。



Answer 2:

这正是我问这里 。 通过我自己玩弄的时候,我无法弄清楚如何使它工作,所以我最后不得不做的一种变通方法。

翻译我做了什么到你的代码:

您的许可类名更改为其他的东西(在这种情况下,我会用LicenseCode),然后创建一个名为许可的对象。 这个对象,在我的情况,至少有一个ID和名称。 该ID实际上是在我的枚举分配整数值。 你可以使用,如果你想以同样的方式枚举的名称,只是恰克下面的代码在名称,而不是ID翻译。 在课堂上,添加这样一个属性:

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

然后,创建一个表来匹配你要存储此对象的数据(ID和名称)

然后,创建的映射。 这将是直接的,你只映射ID和名称。



Answer 3:

你有没有考虑过使用标志与你的枚举类的属性,而不是让他们的名单?



文章来源: Map to a list of Enums?