3 Stimmen

Abbildung auf eine Liste von Enums?

Ich brauche, um eine Klasse, die eine Liste von Enums zu einer DB-Tabelle, mit NHibernate abbilden hat

Hier sind die Objekte

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
}

---------------- Hier ist die DB-Tabelle

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

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

-------------Hier ist meine Fluent-Karte für Driver

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");
    }

}

----- Dies erzeugt die folgende HBM-Datei

<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>

Hier ist mein Fehler

"Eine Assoziation aus der Tabelle DriverLicence verweist auf eine nicht abgebildete Klasse: Taxi.DomainObjects.Licence"

Weiß jemand, was ich falsch mache?

5voto

John Rayner Punkte 3485

Enums werden von NHibernate als primitiver Typ betrachtet, daher sollten Sie nicht mit einer many-to-many mit einer Klasse attribute . In der .hbm-Sprache bräuchte man so etwas wie dies:

<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>

Obwohl man bei einer hbm-Zuordnung wie dieser die lange type Attribut. Meine Fluent-Syntax ist nicht sehr gut, daher kann ich Ihnen leider nicht weiterhelfen. Diese Frage kann weiterhelfen.

0voto

Josh Punkte 15955

Das ist genau das, was ich gefragt habe aquí . Durch eigenes Herumprobieren konnte ich nicht herausfinden, wie es funktioniert, so dass ich am Ende eine Art Umgehung machen musste.

um das, was ich gemacht habe, in Ihren Code zu übersetzen:

Ändern Sie den Klassennamen License in einen anderen Namen (in diesem Fall verwende ich LicenseCode), und erstellen Sie dann ein Objekt namens License. Dieses Objekt hat, zumindest in meinem Fall, eine Id und einen Namen. Die Id ist eigentlich der Integer-Wert, der in meiner Enum zugewiesen wurde. Sie könnten den Namen der Enum auf die gleiche Weise verwenden, wenn Sie wollten, und einfach den Code unten ändern, um den Namen anstelle der Id zu übersetzen. Fügen Sie in der Klasse eine Eigenschaft wie diese hinzu:

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

Erstellen Sie dann eine Tabelle, die den Daten entspricht, die Sie für dieses Objekt speichern werden (ID und Name)

Erstellen Sie dann das Mapping. Dies ist sehr einfach, da Sie nur die Id und den Namen zuordnen müssen.

0voto

Martin R-L Punkte 3989

Haben Sie in Erwägung gezogen, das Attribut Flags mit Ihrer Enum-Klasse zu verwenden, anstatt eine Liste von ihnen zu haben?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X