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

使用2种策略通过fluent nhibernate映射类层次结构,nhibernate,inheritance,hierarchy,fluent,class-hierarchy,Nhibernate,Inheritance,Hierarchy,Fluent,Class Hierarchy,我想使用fluent-nhibernate或nhibernate本身(我指的是hbm文件)组合每个类的表和每个层次结构的表策略,但我不知道如何组合。我更喜欢流利而不是hbm,但如果这是不可能的,那么hbm也可以。我通过在fluent中引入实体作为类映射和所有其他作为子类映射来测试这一点,但在fluent生成的hbm文件中,实体是一个类,所有其他都是连接的类,这不是我想要的。下面我将更详细地描述这个问题 类层次结构: public class Entity { public int

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

类层次结构:

    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; }
}
我希望一个表用于实体,一个表用于person及其所有类型(所有子类)。我的意思是,我希望对实体使用每个类的表策略,对person和SystemUser类使用每个层次结构的表策略。数据库结构如下所示:

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

非常感谢您的帮助。

如果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);
    }
}
publicpersonmap:ClassMap
{
公众人物地图()
{
表格(“个人资料”);
Id(p=>p.Id,“EntityID”).GeneratedBy.HiLo(“100”);
区分子类子列(“PersonType”);
地图(x=>x.Phone);
Join(“EntityTable”,Join=>
{
join.KeyColumn(“ID”);
join.Map(p=>p.Name);
});
}
}
公共系统用户映射:子类映射
{
公共系统用户映射()
{
映射(x=>x.Password);
}
}

谢谢您的回复,但不,这不是我想要的。请看一下数据库结构和两个表。一个用于实体,一个用于所有类型的人。infact person是抽象的。映射用于过帐表结构。您拥有Person的Hirarch和SystemUser的Hierarch,但两者都共享其名称属性的EntityTable。尝试使用
SchemaExport(config)。在控制台应用程序中执行(true,false,false)
,查看我的意思,除了我发布的内容,我想不出其他方法,因为NH不允许在
中使用DiscrimiteToColumn。根据您的建议,我有3个表:表(“SystemUserTable”)和表(“PersonTable”)以及联接(“EntityTable”…但我只有两个表实体和Person,SystemUser转到Person表。你们明白我的意思吗?好吧,最好还是删除表(“SystemUserTable”);来自SystemUserMap!这里的要点是,ID是在实体中生成的,正如您所看到的,我的Person类上没有ID属性,正如您所提到的。如果我将其声明为ClassMap,则需要属于实体表的ID,如果我声明为SubClassMap,则无法使用DiscriminateSubClassesOnColumn。这就是现在的问题。