Отображение иерархии классов через свободный nhibernate с использованием 2 стратегий - PullRequest
1 голос
/ 21 декабря 2011

Я хочу объединить стратегии «таблица на класс» и «таблица на иерархию», используя беглый nhibernate или сам nhibernate (я имею в виду файлы hbm), но я не знаю как. Я предпочитаю беглость, а не hbm, но если это невозможно, то hbm тоже подойдет. Я проверил это, представив Entity как ClassMap и все остальные как SubClassMap в свободном доступе, но затем в 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 Ответ

0 голосов
/ 21 декабря 2011

, если 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);
    }
}
...