2

Fluent NHibernate를 사용하는 일반 저장소로 하위 클래스를 구현하는 가장 좋은 방법을 이해하는 데 약간의 어려움이 있습니다. 다음과 같이 Fluent 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는이 사람이 baseclass 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

+0

@zoidbeck pleas 마지막 코멘트, 링크 또는 예문에 대해 자세히 설명해 주시겠습니까? – mxmissile

관련 문제