nhibernate一对多集合 - 只检索超类

时间:2010-12-16 08:55:36

标签: nhibernate fluent-nhibernate nhibernate-mapping

我有以下课程:

class Person
{
    public string Name { get; set; }
}

class Employee : Person
{
    public int Salary { get; set; }
}

class Company
{
    public IList<Person> PeopleWhoAreNotEmployees { get; set; }
}


使用table-per-class-heirarchy策略映射人员和员工。
当我检索PeopleWhoAreNotEmployees集合时,我希望它只包含Person和NOT Employees的元素。
我如何(流利地)配置集合以仅检索超类的元素?
我认为这与多态性属性有关,但我无法弄清楚如何做到这一点。


感谢,
的Jhonny

编辑:
在与Jamie讨论之后,我觉得我需要澄清一下,这里的案例不是真正的Person和Employee,而是更像Employee和HistoricalEmployee。
意思是 - 当员工'去世'时,他们并没有真正删除,但他们成为了HistoricalEmployee(还有一些属性,例如终止日期等)。
显然,随着时间的推移,HistoricalEmployees的数量将超过员工数量,因此当我只需要当前员工时,我无法获取所有HistoricalEmployees。
对不起原始问题的不确定性......
Ĵ

P.S.
我没有改变原来的问题,因为它会使答案无关紧要。
这个问题的新版本可用here

2 个答案:

答案 0 :(得分:2)

我认为你不能,但不管怎样我都不会接近它。我将使用私有字段进行集合并公开过滤列表的方法。这更容易映射和使用,如果集合的大小合理,性能会很好(我不知道什么是合理的,但如果它是<1000则我不担心它)。如果你有一个抽象的PersonBase类,Person和Employee都会扩展,这样你就不必处理Person可能成为Employee的不确定性了。

public class Company
{
    private IList<Person> _allPeople;

    public IEnumerable<Employee> Employees()
    {
        return _allPeople.OfType<Employee>();
    }

    public IEnumerable<Person> PeopleWhoAreNotEmployees()
    {
        return _allPeople.Where(x => !(x is Employee));
    }
}

编辑:

在回复您的评论时,过滤将在课程中进行。私有集合将导致加载所有People,并且属性将动态过滤该集合。映射看起来像:

public class CompanyMap : ClassMap<Company>
{
    public CompanyMap ()
    {
        // only collection is shown w/o cascade option
        HasManyToMany(x => x.Person).Access.CamelCaseField(Prefix.Underscore);
    }
}

答案 1 :(得分:0)

我最终做的是在我的财产上使用'where'条款。 流畅的配置如下所示:

 mapping.HasMany(x => x.Employees)
            .Where("IsFired = 0")