鉴于以下场景,我希望使用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- { public ItemMap() { WithTable("Item"); Id(x => x.ItemId, "ItemId"); Map(x => x.FieldA, "FieldA"); JoinedSubClass
("ItemId", MapConcreteItemX); JoinedSubClass ("ItemId", MapConcreteItemY); } private static void MapConcreteItemX(JoinedSubClassPart part) { part.WithTableName("ConcreteItemX"); part.Map(x => x.FieldC, "FieldC"); } private static void MapConcreteItemY(JoinedSubClassPart part) { part.WithTableName("ConcreteItemX"); part.Map(x => x.FieldD, "FieldD"); } }
FieldB
未映射.
问题
如何使用Fluent NHibernate 映射类的FieldB
属性SubItem
?
有什么办法可以利用DiscriminateSubClassesOnColumn
这个ItemType
领域吗?
附录
我可以使用hbm.xml文件实现所需的结果:
如何使用Fluent NHibernate完成上述映射?
是否可以使用Fluent NHibernate将table-per-class-hierarchy与table-per-subclass混合使用?
我知道这已经很老了,但是现在设置流畅来生成你最初想要的精确映射非常简单.因为我在搜索答案时遇到了这个帖子,我以为我会发布它.
您只需为基类创建ClassMap,而无需引用您的子类:
public class ItemMap : ClassMap- { public ItemMap() { this.Table("Item"); this.DiscriminateSubClassesOnColumn("ItemType"); this.Id(x => x.ItemId, "ItemId"); this.Map(x => x.FieldA, "FieldA"); } }
然后映射你的抽象子类,如下所示:
public class SubItemMap: SubclassMap{ public SubItemMap() { this.Map(x => x.FieldB); } }
然后映射你的具体子类,如下所示:
public class ConcreteItemXMap : SubclassMap{ public ConcretItemXMap() { this.Join("ConcreteItemX", x => { x.KeyColumn("ItemID"); x.Map("FieldC") }); } }
希望这有助于其他人用流利的方式寻找这种类型的映射.