鉴于以下场景,我想使用 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
类是抽象的。
数据库模式
+------------+ +----------------+ +----------------+ | 项目 | | 混凝土项目X | | 具体项目Y | +==========+ +================+ +===============+ | 项目 ID | | 项目 ID | | 项目 ID | | 项目类型 | | 场C | | 字段D | | 字段A | +---------------+ +----------------+ | 字段B | +----------+
该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
未映射。
问题
如何使用 Fluent NHibernate 映射类的FieldB
属性?SubItem
有什么方法可以利用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 将每类层次结构表与每子类表混合?