0

我使用 Fluent NHibernate (1.2.0.712) 将每个层次结构表映射到现有数据库时遇到问题。这是简化的情况。

我的班级结构:

类图

数据库结构:

数据库图

所以基本上,我们有 1 个表(实体),其中包含一些特定数据(ID 和名称)+ 几个外键(到 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 并发现

如果你想做一个 table-per-class-hierarchy 策略,那么你只需要在 ClassMap 中指定鉴别器列。

但是,据我了解,我没有鉴别器列。我的情况是根据外键引用确定子类。

注意:对于多个鉴别器列,请使用 DiscriminateSubClassesOnColumn("").Formula([insert custom sql here])

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

有人可以帮我吗?提前致谢 :)

4

1 回答 1

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

ConcreteEntity1Map()
{
    DiscriminatorValue(1);
}
于 2012-01-16T16:02:21.550 回答