Учитывая следующий сценарий, я хочу сопоставить иерархию типов со схемой базы данных, используя Fluent NHibernate.
Я использую NHibernate 2.0
Иерархия типов
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; }
}
См. Изображение
Классы Item
и SubItem
являются абстрактными.
Схема базы данных
+----------+ +---------------+ +---------------+
| Item | | ConcreteItemX | | ConcreteItemY |
+==========+ +===============+ +===============+
| ItemId | | ItemId | | ItemId |
| ItemType | | FieldC | | FieldD |
| FieldA | +---------------+ +---------------+
| FieldB |
+----------+
См. Изображение
Поле ItemType
определяет тип бетона.
Каждая запись в таблице ConcreteItemX
имеет одну соответствующую запись в таблице Item
; аналогично для ConcreteItemY
таблицы.
FieldB
всегда равно нулю, если тип элемента ConcreteItemY
.
Отображение (пока)
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
не отображается.
Вопрос
Как сопоставить свойство FieldB
класса SubItem
с помощью Fluent NHibernate?
Можно ли как-нибудь использовать DiscriminateSubClassesOnColumn
, используя поле ItemType
?
Добавление
Я могу достичь желаемого результата, используя файл 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>
Как выполнить приведенное выше сопоставление с помощью Fluent NHibernate?
Можно ли смешивать таблицу на иерархию классов с таблицей на подкласс, используя Fluent NHibernate?