這個問題真的是,以確定是否有什麼即時試圖實現是可能的。繼承與功能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,實體的:學生
感謝您的答覆,我不知道那是什麼我後我。 (如果我理解正確)單表需要一個鑑別列,以便NHB可以制定出哪一個類實例。如果我想要將同一行實例化爲兩種不同的子類型,即可以將同一人員記錄實例化爲學生和申請人。 我需要在Person表中有兩行,每個都有一個表示申請人和學生實例的鑑別器? 感謝 和黑桃 – user397953 2010-07-22 10:09:12
感謝您的答覆,我不知道那是什麼我後我。 (如果我理解正確)單表需要一個鑑別列,以便NHB可以制定出哪一個類實例。如果我想要將同一行實例化爲兩種不同的子類型,即可以將同一人員記錄實例化爲學生和申請人。 我需要在Person表中有兩行,每個都有一個表示申請人和學生實例的鑑別器? 謝謝 – user397953 2010-07-22 10:09:49
如果我沒有弄錯,他們必須有不同的領域,這就是全部。 I.E:申請人有AID字段,學生有SID字段。但是我真的不知道它是如何在沒有空約束的情況下分辨差異的(如果一切都是空的,你只是無法理解類是否考慮該字段)。所以也許其他的領域必須是不可數的。但是,這些是我的想法,你最好自己谷歌,以獲得更可靠的信息。 PS:你不能將申請人轉換爲學生,因爲它們不在同一個繼承分支中 - 這是平行的。 – foret 2010-07-22 10:55:03