【问题标题】:inheritance with fluent nhibernate用流利的nhibernate继承
【发布时间】:2010-07-21 13:38:00
【问题描述】:

这个问题真的是要确定我试图实现的目标是否可行。

我有三个表,我将省略实际名称以使其简单且不那么混乱

所以我们有

人 [ PID - 唯一标识符 PK ]

申请人 [ PID - 唯一标识符 PK, AID - varchar(20)]

学生 [ PID - 唯一标识符 PK, SID - 整数]

student 表和applicant 表都与person 表具有一对一的关系(主键保存在person 表中),但彼此不相关。

我有以下域对象

public class Person
{
    public virtual Guid PID{get;set;}
}

public class Applicant: Person
{
    public virtual string AID {get;set;}
}

public class Student:Person
{
    public virtual int SID {get;set;}
}

它们每个都有一个从 ClassMap 或 SubClassMap 派生的地图类

public class PersonMap: ClassMap<Person>
{
    public PersonMap()
    {
        Id(x => x.PID).GeneratedBy.Assigned();
        Table("Person");
    }
}

public class ApplicantMap: SubclassMap<Applicant>
{
    public ApplicantMap()
    {
        Table("Applicant");
        KeyColumn("PID");
        Map(x => x.AID);
    }
}

public class StudentMap:SubclassMap<Student>
{
    public StudentMap()
    {
        Table("Student");
        KeyColumn("PID");
        Map(x => x.SID);
    }
}

我的问题是,是否有可能同时拥有一个申请人和学生。在数据库方面,我可以在每个表中拥有一个包含相同 PID 的行,nhibernate 将允许我保存和检索所有三个对象?

我遇到的一个问题是,当申请人和当然人员的 id 已经存在时,我试图将其插入到 student 中。

public void MakePersonAStudent(Person p)
{
    Student newStudent = new Student();
    newStudent.PID = p.PID;
    newStudent.SID = getNewStudentID();
    Session.Save(newPerson);
}    

产生的异常是:

具有相同标识符值的不同对象已与会话关联.... 73e5fd90-c27a-49d8-87dc-cd6413c120a2,实体:Student

【问题讨论】:

    标签: fluent-nhibernate


    【解决方案1】:

    【讨论】:

    • 感谢您的回复,我不确定这是我想要的。 (如果我理解正确的话)单表需要一个鉴别器列,以便 NHB 可以确定要实例化哪个类。如果我希望将同一行实例化为两种不同的子类型,即可以将同一个人记录实例化为学生和申请人。我是否需要 Person 表中的两行,每行都有一个表示申请人和学生实例的鉴别器?谢谢&黑桃
    • 感谢您的回复,我不确定这是我想要的。 (如果我理解正确的话)单表需要一个鉴别器列,以便 NHB 可以确定要实例化哪个类。如果我希望将同一行实例化为两种不同的子类型,即可以将同一个人记录实例化为学生和申请人。我是否需要 Person 表中的两行,每行都有一个表示申请人和学生实例的鉴别器?谢谢
    • 如果我没记错的话,他们肯定在字段上有差异,仅此而已。即:申请人有 AID 字段,学生有 SID 字段。但是我真的不知道它如何在没有非空约束的情况下分辨出差异(因为如果一切都为空,你就无法理解类是否考虑该字段。)。所以也许附加字段必须是 not_nullable。但这些是我的想法,你最好自己google一下以获得更可靠的信息。 PS:您不能将申请人转换为学生,因为不在同一个继承分支中 - 有并行。
    • 好的,我在阅读了第 9.1.2 节之后。 “每个子类的表”并认为这就是我想要实现的目标。是否有可能进行此实现并且在申请人表中也存在具有相同 ID 的学生?再次感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多