Gegeben das folgende Szenario, ich möchte die Typhierarchie mit Fluent NHibernate dem Datenbankschema zuordnen.Vererbung Mapping mit fließendem NHibernate
Ich verwende NHibernate 2,0
Typ Hierarchie
public abstract class Item
{
public virtual int ItemId { get; set; }
public virtual string ItemType { get; set; }
public virtual string FieldA { get; set; }
}
public abstract class SubItem : Item
{
public virtual string FieldB { get; set; }
}
public class ConcreteItemX : SubItem
{
public virtual string FieldC { get; set; }
}
public class ConcreteItemY : Item
{
public virtual string FieldD { get; set; }
}
Die Item
und SubItem
Klassen sind abstrakt.
Datenbank-Schema
+----------+ +---------------+ +---------------+ | Item | | ConcreteItemX | | ConcreteItemY | +==========+ +===============+ +===============+ | ItemId | | ItemId | | ItemId | | ItemType | | FieldC | | FieldD | | FieldA | +---------------+ +---------------+ | FieldB | +----------+
Das ItemType
Feld bestimmt den konkreten Typ.
Jeder Datensatz in der ConcreteItemX
Tabelle hat einen einzigen entsprechenden Datensatz in der Item
Tabelle; ebenso für die ConcreteItemY
Tabelle.
FieldB
ist immer Null, wenn der Elementtyp ConcreteItemY
ist.
Der Mapping (bisher)
public class ItemMap : ClassMap<Item>
{
public ItemMap()
{
WithTable("Item");
Id(x => x.ItemId, "ItemId");
Map(x => x.FieldA, "FieldA");
JoinedSubClass<ConcreteItemX>("ItemId", MapConcreteItemX);
JoinedSubClass<ConcreteItemY>("ItemId", MapConcreteItemY);
}
private static void MapConcreteItemX(JoinedSubClassPart<ConcreteItemX> part)
{
part.WithTableName("ConcreteItemX");
part.Map(x => x.FieldC, "FieldC");
}
private static void MapConcreteItemY(JoinedSubClassPart<ConcreteItemY> part)
{
part.WithTableName("ConcreteItemX");
part.Map(x => x.FieldD, "FieldD");
}
}
FieldB
wird nicht abgebildet.
Die Frage
Wie ordne ich die FieldB
Eigenschaft der SubItem
Klasse mit Fluent NHibernate?
Gibt es eine Möglichkeit, DiscriminateSubClassesOnColumn
mit dem ItemType
Feld zu nutzen?
Nachtrag
Ich bin in der Lage, das gewünschte Ergebnis mit einer hbm.xml Datei zu erreichen:
<class name="Item" table="Item">
<id name="ItemId" type="Int32" column="ItemId">
<generator class="native"/>
</id>
<discriminator column="ItemType" type="string"/>
<property name="FieldA" column="FieldA"/>
<subclass name="ConcreteItemX" discriminator-value="ConcreteItemX">
<!-- Note the FieldB mapping here -->
<property name="FieldB" column="FieldB"/>
<join table="ConcreteItemX">
<key column="ItemId"/>
<property name="FieldC" column="FieldC"/>
</join>
</subclass>
<subclass name="ConcreteItemY" discriminator-value="ConcreteItemY">
<join table="ConcreteItemY">
<key column="ItemId"/>
<property name="FieldD" column="FieldD"/>
</join>
</subclass>
</class>
Wie kann ich das oben Mapping mit Fluent NHibernate erreichen?
Ist es möglich, Tabelle-pro-Klasse-Hierarchie mit Tabelle-pro-Unterklasse mit Fluent NHibernate zu mischen?
Gibt es einen Grund dafür, dass dies Community-Wiki ist? Könnten Sie auf jeden Fall die von Ihnen verwendete Mapping-Strategie klären? JoinedSubClassPart impliziert das Muster "Tabelle pro Unterklasse", aber das Angeben konkreter Elemente in der Tabelle "Item" impliziert das Muster "Tabelle-pro-Klasse-Hierarchie". –
Ich weiß nicht, wie ich die Community-Wiki-Einstellung ändern soll. Ignorieren von FieldB, kann ich Tabelle-pro-Unterklasse verwenden. Die Anwesenheit von FieldB verursacht mir einige Verwirrung. Es scheint eine Mischung der beiden Strategien zu sein. Der ConcreteItemX-Typ erbt FieldB von SubItem. FieldB wird in der Item-Tabelle beibehalten. –