2012-04-04 7 views
0

Ich habe eine Tabelle namens DomainType, die mehrere Name/Wert-Paare zusammen mit einer Domain-Spalte enthält, die Zeilen identifiziert, die zusammen gehören. Ich habe zwei C# -Klassen namens PackageType und ComponentType, die beide ihre Daten in derselben Tabelle speichern, wobei ihre Domänenwerte "PackageType" bzw. "ComponentType" sind. Ich dachte, ich könnte das NHibernate-Diskriminator-Konzept in meinen hbm.xml-Dateien verwenden, um diese zu definieren, aber jedes Mal, wenn ich nach PackageTypes in meiner App frage, bekomme ich alle Zeilen aus der DomainType-Tabelle zurück.NHibernate Discrimator

An diesem Punkt bin ich nicht sicher, ob meine Mapping-Logik/Syntax schlecht ist oder ob ich das Konzept für Diskriminatoren einfach falsch verstehe. Dies sind schließlich keine Unterklassen, vielleicht ist dies nicht die richtige Strategie (?).

Hier ist die Mapping-Datei für meine PackageType Tabelle:

<class name="PackageType" table="DomainType" 
    discriminator-value="PackageType" dynamic-update="true"> 

    <id name="Id" column="Id" type="Int32" unsaved-value="0"> 
     <generator class="identity" /> 
    </id> 

    <discriminator column="Domain" type="AnsiString" not-null="true" /> 

    <property name="Description" column="Description" 
    type="AnsiString" length="100" not-null="true" /> 
</class> 

Hier ist der C# -Code, die alle Zeilen aus der DomainType Tabelle zurückgibt (auch diejenigen, bei denen Domain = "Component"):

IEnumerable<PackageType> rslt = GetSession().Query<PackageType>().ToList(); 
+0

Diskriminatoren arbeiten nur auf Sub-Klassen (glaube ich) – Rippo

Antwort

1

Sie müssen eine abstrakte Klasse DomainType definieren, von der sowohl PackageType als auch ComponentType erben, und anschließend ein einzelnes Zuordnungsdokument "DomainType.hbm.xml" erstellen, das die Zuordnung für beide Unterklassen enthält. Dies wird in der NHibernate-Referenzdokumentation auf Table-per-class-hierarchy verwiesen.

<hibernate-mapping namespace=" ... " assembly=" ... "> 
    <class name="DomainType" abstract="true" table="DomainType"> 
    <id name="Id" column="Id" type="Int32" unsaved-value="0"> 
     <generator class="identity" /> 
    </id> 
    <discriminator column="Domain" type="AnsiString" not-null="true" /> 
    <subclass name="PackageType" discriminator-value="PACKAGE"> 
     <property .../> 
    </subclass> 
    <subclass name="ComponentType" discriminator-value="COMPONENT"> 
     <property .../> 
    </subclass> 
    </class> 
</hibernate-mapping> 

Dann können Sie eine Abfrage für PackageType oder ComponentType erstellen.

+0

Also @MartinB, das ist das Herz meiner Frage: erfordert ** ** ** ** ich künstlich diese neue Elternklasse DomainType einzuführen, auch wenn ich es nicht will in meinem Modell? Wenn nicht, ist das cool, ich werde lernen, damit zu leben. Aber es scheint, als wäre es einfach genug für die NHibernate-Engine, das Diskriminator-Konzept zu verwenden, ohne eine künstliche Elternklasse zu benötigen. In dieser App werde ich niemals die DomainType-Klasse direkt verwenden. Es hat keinen Zweck in meiner Domäne und könnte meine Kollegen beim Studium meines Modells möglicherweise verwirren. – sisdog