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

Posted

技术标签:

【中文标题】使用 Fluent NHibernate 将每个层次结构映射到现有数据库的表,没有鉴别器列【英文标题】:Table per hierarchy mapping to an existing database using Fluent NHibernate without discriminator column 【发布时间】:2012-01-16 13:34:14 【问题描述】:

我在使用 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);
    

所以实际上我的问题是我应该如何映射派生类? 我浏览了 fluent nhibernate wiki,发现

如果您想执行每类层次结构表的策略,那么您只需要在 ClassMap 中指定鉴别器列。

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

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

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

谁能帮助我? 在此先感谢:)

【问题讨论】:

【参考方案1】:
DiscriminateSubClassesOnColumn("")
    .Formula(case when ReferencedObject1id > 0 then 1 else case when ReferencedObject2id > 0 then 2 else ... end)

ConcreteEntity1Map()

    DiscriminatorValue(1);

【讨论】:

以上是关于使用 Fluent NHibernate 将每个层次结构映射到现有数据库的表,没有鉴别器列的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate + Fluent NHibernate 异常

使用 Fluent NHibernate 和 NHibernate 3 将枚举映射为 Int

使用 ADO.NET 流畅的 NHibernate 地图

Fluent 映射和 NHibernate Xml 配置

Fluent Nhibernate将集合映射到通用实体

NHibernate 2 + Fluent Nhibernate 中等信任