通过使用2策略通过流畅的nhibernate映射类层次结构

时间:2011-12-21 11:22:37

标签: nhibernate inheritance hierarchy fluent class-hierarchy

我想使用流畅的nhibernate或nhibernate本身(我的意思是hbm文件)来组合每个类的表和每个层次的表策略,但我不知道如何。我更喜欢流利于hbm,但如果不可能,那么hbm也没关系。我通过将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; }
}

我希望有一个表用于实体,一个用于人及其各种类型(所有子类)。我的意思是我想为Person使用每个类的表策略,并为Person使用每个层次的表策略SystemUser类。数据库结构是这样的:

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

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:0)

如果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);
    }
}