【问题标题】:Mapping class hierarchy through fluent nhibernate by using 2 strategies使用 2 种策略通过 fluent nhibernate 映射类层次结构
【发布时间】: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)    

任何帮助表示赞赏。

【问题讨论】:

    标签: nhibernate inheritance hierarchy fluent class-hierarchy


    【解决方案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。这就是现在的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多