2

難以理解使用Fluent NHibernate實現具有通用存儲庫的子類的最佳方式。流利的NHibernate存儲庫與子類

我有一個基類和兩個子類,說:

public abstract class Person 
{ 
    public virtual int PersonId { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
} 

public class Student : Person 
{ 
    public virtual decimal GPA { get; set; } 
} 

public class Teacher : Person 
{ 
    public virtual decimal Salary { get; set; } 
} 

我的映射如下:

public class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     Table("Persons"); 

     Id(x => x.PersonId).GeneratedBy.Identity(); 

     Map(x => x.FirstName); 
     Map(x => x.LastName); 
    } 
} 


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

public class TeacherMap : SubclassMap<Teacher> 
{ 
    public TeacherMap() 
    { 
     Table("Teachers"); 
     KeyColumn("PersonId"); 
     Map(x => x.Salary); 
    } 
} 

我使用一個通用存儲庫來保存/ retreive /更新的實體,並它工作得很好 - 只要我在使用Repository,我已經知道我正在與學生一起工作或與老師一起工作。

我遇到的問題是這樣的:當我有一個ID,需要確定人的類型時會發生什麼?如果用戶以PersonId = 23的身份來到我的網站,我該如何確定它是哪種類型的人?

回答

2

NHibernate會爲你管理這個。你唯一需要做的就是查詢ID爲23的Person .NHibernate將返回這個人作爲它的基類Person輸出的任何類型。

Person p = dao.FindById<Person>(23); 
if(p is Teacher) 
{ 
    Teacher t = (Teacher)p; 
} 
else if(p is Student) 
{ 
    Studet s =(Student)p; 
} 

這當然是一個簡單的例子,但我希望它顯示了多態繼承的原理。戰略模式和泛型是對付這些醜陋類型檢查的強大武器。

+0

這超出了真棒。我每天都會用Fluent NHibernate(或者NHibernate)來學習新東西。謝謝! – reallyJim 2010-04-27 03:41:11

+0

@zoidbeck請求詳細說明最後的評論,鏈接或示例? – mxmissile 2010-04-27 07:32:42