流畅的NHibernate存储库与子类

时间:2010-04-26 22:07:49

标签: c# nhibernate fluent-nhibernate repository-pattern subclass

使用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);
    }
}

我使用通用存储库来保存/检索/更新实体,并且它很有效 - 只要我在使用Repository - 我已经知道我正在与学生一起工作或者与老师一起工作。

我遇到的问题是:当我有一个ID,需要确定人的类型时会发生什么?如果用户以PersonId = 23来到我的网站,我该如何确定它是哪种类型的人?

1 个答案:

答案 0 :(得分: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;
}

这当然是一个简单的例子,但我希望它能说明多态继承的原理。策略模式和泛型是对抗这些丑陋类型检查的强大武器。