使用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来到我的网站,我该如何确定它是哪种类型的人?
答案 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;
}
这当然是一个简单的例子,但我希望它能说明多态继承的原理。策略模式和泛型是对抗这些丑陋类型检查的强大武器。