Dado el siguiente escenario, quiero asignar la jerarquía de tipos al esquema de la base de datos utilizando Fluiber NHibernate.Asignación de herencia con NHibernate fluido
estoy usando NHibernate 2,0
Tipo Jerarquía
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; }
}
Los Item
y SubItem
clases son abstractas.
Base de datos de esquema
+----------+ +---------------+ +---------------+ | Item | | ConcreteItemX | | ConcreteItemY | +==========+ +===============+ +===============+ | ItemId | | ItemId | | ItemId | | ItemType | | FieldC | | FieldD | | FieldA | +---------------+ +---------------+ | FieldB | +----------+
El campo ItemType
determina el tipo de hormigón.
Cada registro en la tabla ConcreteItemX
tiene un registro único correspondiente en la tabla Item
; del mismo modo para la tabla ConcreteItemY
.
FieldB
es siempre nulo si el tipo de elemento es ConcreteItemY
.
El Mapping (hasta ahora)
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
no está asignada.
La pregunta
¿Cómo puedo asignar la propiedad de la clase FieldB
SubItem
usando Fluido NHibernate?
¿Hay alguna forma de que pueda aprovechar DiscriminateSubClassesOnColumn
usando el campo ItemType
?
Adición
soy capaz de lograr el resultado deseado mediante un archivo 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>
¿Cómo llevar a cabo la asignación anterior utilizando Fluido NHibernate?
¿Es posible mezclar tabla por jerarquía de clases con tabla por subclase utilizando Fluidez NHibernate?
¿Alguna razón por la cual esta marcada wiki de la comunidad? En cualquier caso, ¿podría aclarar la estrategia de mapeo que está utilizando? JoinedSubClassPart implica el patrón de tabla por subclase, pero decir que los elementos concretos persisten en la tabla de elementos implica el patrón de tabla por jerarquía de clases. –
No estoy seguro de cómo cambiar la configuración wiki de la comunidad. Ignorando FieldB, puedo usar table-per-subclass. La presencia de FieldB me causa cierta confusión. Parece ser una mezcla de las dos estrategias. El tipo ConcreteItemX hereda FieldB de SubItem. FieldB persiste en la tabla de elementos. –