使用 2 种策略通过 fluent nhibernate 映射类层次结构

Posted

技术标签:

【中文标题】使用 2 种策略通过 fluent nhibernate 映射类层次结构【英文标题】:Mapping class hierarchy through fluent nhibernate by using 2 strategies 【发布时间】:2011-12-21 11:22:37 【问题描述】:

我想使用流利的 nhibernate 或 nhibernate 本身(我的意思是 hbm 文件)组合每类表和每层次表策略,但我不知道如何。我更喜欢流利而不是 hbm,但如果不可能,那么 hbm 也可以。我通过在 fluent 中引入 Entity 作为 ClassMap 和所有其他作为 SubClassMap 来测试这一点,但是在 fluent 生成的 hbm 文件中,Entity 是一个类,而所有其他都是连接类,这不是我想要的。我将在下面更详细地描述这个问题。

类层次结构:

    public class Entity

    public int ID  get; set; 
    public string Name  get; set; 


public abstract class Person : Entity

    public string Phone  get; set; 


public class SystemUser : Person

    public string Password  get; set; 

我想有一张实体表和一张人表以及所有类型的表(所有子类)。我的意思是我想对实体使用每类表策略,对人使用每层次表策略和SystemUser 类。数据库结构是这样的:

EntityTable(ID(PK),Name)
PersonTable(EntityID(PK,FK),Phone,Password)    

任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

如果 EntityTable Id 不是数据库生成的(NH 不鼓励这样做),您可以使用该技巧

public PersonMap : ClassMap<Person>

    public PersonMap()
    
        Table("PersonTable");

        Id(p => p.Id, "EntityID").GeneratedBy.HiLo("100");

        DiscriminateSubClassesOnColumn("PersonType");

        Map(x => x.Phone);

        Join("EntityTable", join =>
        
            join.KeyColumn("ID");
            join.Map(p => p.Name);
        );
    



public SystemUserMap : SubclassMap<SystemUser>

    public SystemUserMap()
    
        Map(x => x.Password);
    

【讨论】:

感谢您的回复,但不,这不是我想要的。请看一下数据库结构和两个表。一种用于实体,一种用于各种人员。事实上,人是抽象的。 映射用于发布的表结构。你有一个 Person 的层次结构和一个 SystemUser 的层次结构,但它们都为它们的 name 属性共享 EntityTable。尝试在控制台应用程序中使用 SchemaExport(config).Execute(true, false, false) 以了解我的意思 除了我发布的内容之外,我想不出办法,因为 NH 不允许在 &lt;join&gt; 中使用 discriminatetocolumn 根据您的建议,我有 3 个表:Table("SystemUserTable") 和 Table("PersonTable") 和 Join("EntityTable"... 但我只有 2 个表 Entity 和Person 和 SystemUser 转到 person 表。你明白我的意思吗? 好的,更好但再次删除 Table("SystemUserTable");来自 SystemUserMap!这里的重点是 ID 是在 Entity 中生成的,如您所见,我的 Person 类上没有 ID 属性 - 您已经提到过。如果我将它声明为 ClassMap,它需要属于实体表的 ID,如果我将其声明为 SubClassMap,那么我不能使用 DiscriminateSubClassesOnColumn。这就是现在的问题。

以上是关于使用 2 种策略通过 fluent nhibernate 映射类层次结构的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate 2 + Fluent Nhibernate 中等信任

Fluent Nhibernate 映射多重连接

Fluent NHibernate - NHibernate.QueryException:无法解析属性

在使用fluent-nhibernate配置nhibernate时,为什么会出现MissingMethodException?

通过(Fluent)NHibernate添加到SQLite DB时,DateTime不正确

Fluent NHibernate 禁用缓存