我遇到使用Fluent NHibernate(1.2.0.712)映射到现有数据库的每个层次表的问题。 这是简化的案例。
我的班级结构:
数据库结构:
基本上,我们有1个表(实体),其中包含一些特定数据(Id和Name)+几个外键(对于ReferencedObject1或ReferencedObject2)。
抽象类AbstractEntity包含Id和Name。 ConcreteEntity1和ConcreteEntity2是派生类。
我想根据数据库中的引用来映射这些派生的实例,所以 如果引用ReferencedObject1 - >它是ConcreteEntity1的一个实例。 如果引用ReferencedObject2 - >它是ConcreteEntity2的一个实例。
一些代码:
public class AbstractEntity
{
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
}
public class ConcreteEntity1 : AbstractEntity
{
public virtual ReferencedObject1 ReferencedObject1 { get; set; }
}
public class ConcreteEntity2 : AbstractEntity
{
public virtual ReferencedObject2 ReferencedObject2 { get; set; }
}
public class AbstractEntityMap : ClassMap<AbstractEntity>
{
public AbstractEntityMap()
{
Table("Entities");
Id(e => e.Id);
Map(e => e.Name);
}
}
所以实际上我的问题是我应该如何映射派生类? 我查看了流利的nhibernate wiki并发现了
如果您想要执行每个类的表层次结构策略,那么您只需要在ClassMap中指定discriminator列。
但据我所知,我没有鉴别列。我的情况是根据外键引用确定子类。
注意:对于多个鉴别器列,请使用DiscriminateSubClassesOnColumn(“”)。公式([在此处插入自定义sql])
我找不到配方使用的好例子。它对我的情况有帮助吗?我有点困惑,也许我做错了什么?
有人能帮帮我吗? 在此先感谢:)
答案 0 :(得分:1)
DiscriminateSubClassesOnColumn("")
.Formula(case when ReferencedObject1id > 0 then 1 else case when ReferencedObject2id > 0 then 2 else ... end)
ConcreteEntity1Map()
{
DiscriminatorValue(1);
}