每个层次结构的表使用Fluent NHibernate映射到现有数据库而没有鉴别器列

时间:2012-01-16 13:34:15

标签: .net fluent-nhibernate fluent-nhibernate-mapping

我遇到使用Fluent NHibernate(1.2.0.712)映射到现有数据库的每个层次表的问题。 这是简化的案例。

我的班级结构:

Class Diagram

数据库结构:

Database diagram

基本上,我们有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])

我找不到配方使用的好例子。它对我的情况有帮助吗?我有点困惑,也许我做错了什么?

有人能帮帮我吗? 在此先感谢:)

1 个答案:

答案 0 :(得分:1)

DiscriminateSubClassesOnColumn("")
    .Formula(case when ReferencedObject1id > 0 then 1 else case when ReferencedObject2id > 0 then 2 else ... end)

ConcreteEntity1Map()
{
    DiscriminatorValue(1);
}