Учитывая следующий сценарий, я хочу сопоставить иерархию типов с базой данных с помощью 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
всегда равно null, если тип элемента 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?
Можно ли смешивать иерархию table-per-class с таблицей-подклассом с использованием Fluent NHibernate?