Свободное хранилище NHibernate с подклассами - PullRequest
2 голосов
/ 27 апреля 2010

Трудно понять, как лучше реализовать подклассы с помощью общего репозитория с помощью 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);
    }
}

Я использую общий репозиторий для сохранения / получения / обновления сущностей, и он отлично работает - при условии, что я работаю с репозиторием - где я уже знаю, что я работаю со студентами или работаю с учителями. *

Проблема, с которой я сталкиваюсь, заключается в следующем: что происходит, когда у меня есть идентификатор и необходимо определить ТИП человека? Если пользователь заходит на мой сайт под именем PersonId = 23, как мне выяснить, к какому типу людей это относится?

1 Ответ

2 голосов
/ 27 апреля 2010

NHibernate справится с этим за вас. Единственное, что вам нужно сделать, это запросить Person с идентификатором 23. 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;
}

Это, конечно, простой пример, но я надеюсь, что он показывает принцип наследования полиморфа. Стратегия и дженерики - мощное оружие против этих уродливых проверок типов.

...