Dato il seguente scenario, voglio mappare la gerarchia dei tipi allo schema del database usando Fluent NHibernate.Mapping dell'erede con Fluent NHibernate
Sto usando NHibernate 2,0
Tipo Gerarchia
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; }
}
I Item
e SubItem
classi sono astratto.
Schema del database
+----------+ +---------------+ +---------------+ | Item | | ConcreteItemX | | ConcreteItemY | +==========+ +===============+ +===============+ | ItemId | | ItemId | | ItemId | | ItemType | | FieldC | | FieldD | | FieldA | +---------------+ +---------------+ | FieldB | +----------+
Il campo ItemType
determina il tipo concreto.
Ogni record nella tabella ConcreteItemX
ha un singolo record corrispondente nella tabella Item
; allo stesso modo per la tabella ConcreteItemY
.
FieldB
è sempre nullo se il tipo di articolo è ConcreteItemY
.
Il Mapping (finora)
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
non è mappata.
La questione
Come posso mappare la proprietà FieldB
della classe SubItem
utilizzando Fluent NHibernate?
Esiste un modo per sfruttare lo DiscriminateSubClassesOnColumn
utilizzando il campo ItemType
?
Addendum
sono in grado di ottenere il risultato desiderato utilizzando un file hbm.xml:
<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>
Come compire la mappatura sopra utilizzando Fluent NHibernate?
È possibile combinare la gerarchia table-per-class con la tabella per sottoclasse utilizzando Fluent NHibernate?
Qualsiasi motivo è contrassegnato come wiki della comunità? In ogni caso, potresti chiarire la strategia di mappatura che stai utilizzando? JoinedSubClassPart implica il modello table-per-subclass, ma il dire che gli elementi concreti sono permanenti nella tabella Item implica il pattern table-per-class-hierarchy. –
Non sono sicuro di come modificare l'impostazione wiki della comunità. Ignorando FieldB, posso usare table-per-subclass. La presenza di FieldB mi crea una certa confusione. Sembra essere una miscela delle due strategie. Il tipo ConcreteItemX eredita FieldB da SubItem. FieldB è persistente nella tabella Item. –