2010-07-21 149 views
1

這個問題真的是,以確定是否有什麼即時試圖實現是可能的。繼承與功能NHibernate

我有三個表,我會忽略實際名稱以保持它的簡單和容易混淆

所以我們

人[ PID - 唯一標識符PK ]

申請人 [ PID - uniqueidentifier PK, AID - varchar(20)]

學生 [ PID - 唯一標識符PK, SID - INT]

學生及申請人表都涉及到人表一對一的關係(其中,主鍵設置在人臺保持),但彼此不相關。

我有以下的域對象

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

這些各有從任一類映射或派生的地圖類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已經存在的申請人,當然人的問題之一..

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

產生的例外是:

不同的對象有同樣的標識值已經與會話相關.... 73e5fd90-c27a-49d8-87dc-cd6413c120a2,實體的:學生

回答

0
+0

感謝您的答覆,我不知道那是什麼我後我。 (如果我理解正確)單表需要一個鑑別列,以便NHB可以制定出哪一個類實例。如果我想要將同一行實例化爲兩種不同的子類型,即可以將同一人員記錄實例化爲學生和申請人。 我需要在Person表中有兩行,每個都有一個表示申請人和學生實例的鑑別器? 感謝 和黑桃 – user397953 2010-07-22 10:09:12

+0

感謝您的答覆,我不知道那是什麼我後我。 (如果我理解正確)單表需要一個鑑別列,以便NHB可以制定出哪一個類實例。如果我想要將同一行實例化爲兩種不同的子類型,即可以將同一人員記錄實例化爲學生和申請人。 我需要在Person表中有兩行,每個都有一個表示申請人和學生實例的鑑別器? 謝謝 – user397953 2010-07-22 10:09:49

+0

如果我沒有弄錯,他們必須有不同的領域,這就是全部。 I.E:申請人有AID字段,學生有SID字段。但是我真的不知道它是如何在沒有空約束的情況下分辨差異的(如果一切都是空的,你只是無法理解類是否考慮該字段)。所以也許其他的領域必須是不可數的。但是,這些是我的想法,你最好自己谷歌,以獲得更可靠的信息。 PS:你不能將申請人轉換爲學生,因爲它們不在同一個繼承分支中 - 這是平行的。 – foret 2010-07-22 10:55:03