Коллекция nhibernate один-ко-многим - получение только суперкласса - PullRequest
1 голос
/ 16 декабря 2010

У меня есть следующие классы:

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

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

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


Персона и сотрудник отображаются с использованием стратегии "таблица-на-класс-иерархия".
Когда я получаю коллекцию PeopleWhoAreNotEmployees, я хочу, чтобы она содержала только элементы Person, а НЕ Employees.
Как я могу (свободно) настроить коллекцию для получения только элементов суперкласса?
Я думаю, что это как-то связано со свойством Полиморфизм, но я не мог понять, как это сделать.


спасибо,
Jhonny

EDIT:
После обсуждения с Джейми, я чувствую, что мне нужно уточнить, что дело здесь на самом деле не Персона и Сотрудник, а скорее как Сотрудник и Исторический сотрудник.
То есть, когда сотрудник «умирает», он на самом деле не удаляется,
, но он становится HistoricalEmployee (с еще несколькими атрибутами, такими как дата увольнения и т.д.).
Очевидно, что со временем количество HistoricalEmployee превысит количество Employees по величинам,
, поэтому я не могу выбрать всех HistoricalEmployee, когда мне нужны только текущие Employees. Извините за двусмысленность оригинального вопроса ...
J

P.S.
Я не изменил первоначальный вопрос, так как это сделало бы ответ неуместным.
доступна новая версия этого вопроса здесь

Ответы [ 2 ]

2 голосов
/ 16 декабря 2010

Не думаю, что вы можете, но я бы так не подошел.Я хотел бы использовать личное поле для коллекции и выставить методы, которые фильтруют список.Это гораздо проще сопоставить и работать, и производительность будет хорошей, если размер коллекции достаточно велик (я не знаю, что разумно, но я не стал бы беспокоиться об этом, если она <1000).Было бы проще, если бы у вас был абстрактный класс PersonBase, который расширяется как Person, так и Employee, чтобы вам не приходилось сталкиваться с неопределенностью, что Person может быть Employee. </p>

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

РЕДАКТИРОВАТЬ:

В ответ на ваш комментарий в классе будет проведена фильтрация.Частная коллекция будет вызывать загрузку всех людей, а свойства будут динамически фильтровать эту коллекцию.Картографическое оформление выглядит так:

public class CompanyMap : ClassMap<Company>
{
    public CompanyMap ()
    {
        // only collection is shown w/o cascade option
        HasManyToMany(x => x.Person).Access.CamelCaseField(Prefix.Underscore);
    }
}
0 голосов
/ 16 марта 2011

что я в конечном итоге сделал, так это с помощью предложения 'where' в моей собственности. беглая конфигурация выглядит так:

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