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

发布于 2024-12-22 04:48:54 字数 755 浏览 2 评论 0原文

我想使用流畅的 nhibernate 或 nhibernate 本身(我的意思是 hbm 文件)来组合每类表和每层次结构表策略,但我不知道如何操作。与 hbm 相比,我更喜欢 Fluent,但如果不可能,那么 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; }
}

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

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

任何帮助表示赞赏。

I want to combine table-per-class and table-per-hierarchy strategies using fluent nhibernate or nhibernate itself(I mean hbm files), but I don't know how. I prefer fluent over hbm but if it's impossible, then hbm is also fine. I tested this by introducing Entity as ClassMap and all other as SubClassMap in fluent but then in hbm files generated by fluent, Entity was a class and all other were joined-classes which is not what I want. I will describe the problem in more detail below.

Class hierarchy:

    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; }
}

I want to have one table for entity and one for person and all kinds of it(all its subclasses).I mean I want to use table-per-class strategy for Entity and table-per-hierarchy strategy for Person and SystemUser classes. Database structure is something like this:

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

any help appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

零崎曲识 2024-12-29 04:48:54

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

if EntityTable Id is not database generated (which is discouraged by NH anyways) you can use the trick

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);
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文