Учитывая следующий сценарий, я хочу сопоставить иерархию типов с базой данных с использованием Fluent NHibernate.Наследование с использованием 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; }
}
The 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?
Можно ли смешивать иерархию таблицы за класс с таблицей на подкласс с использованием Fluent NHibernate?
Любые причины, по которым отмечается wiki сообщества? В любом случае, можете ли вы уточнить стратегию сопоставления, которую используете? SessionSubClassPart подразумевает шаблон table-per-subclass, но при условии, что конкретные элементы сохраняются в таблице Item, подразумевается шаблон table-per-class-hierarchy. –
Я не уверен, как изменить настройку вики сообщества. Игнорирование FieldB, я могу использовать таблицу за подкласс. Наличие FieldB вызывает у меня некоторую путаницу. Кажется, это смесь двух стратегий. Тип ConcreteItemX наследует FieldB от SubItem. FieldB сохраняется в таблице Item. – 2009-03-18 05:06:24