Отображение двух отношений «один ко многим» в одну коллекцию в NHibernate - PullRequest
0 голосов
/ 15 марта 2012

Я хотел бы отобразить Person объект.

У меня есть таблица People с полями PersonId, FatherId и MotherId (среди прочих). Две последние ссылки PersonId в той же таблице.

В моей модели предметной области я хотел бы иметь коллекцию Children только для чтения, при этом все остальные Person установили FatherId или MotherId для родительских PersonId.

Один из способов сделать это - использовать два HasMany и карту с использованием внешних ключей FatherId и MotherId соответственно в коллекциях FathersChildren и MothersChildren и вернуть один из них в геттер Children в зависимости от Родительский пол. Но это делает мой домен просто уродливым, так сказать.

Есть ли способ решить это только в отображениях? Я был бы счастлив или бегло или hbm.

1 Ответ

0 голосов
/ 29 января 2013

Ну, я смотрел на свою модель, и мне пришло в голову, что NHibernate требует, чтобы все свойства были virtual, чтобы разрешить отложенную загрузку . Он возвращает объект с классом, который наследует от оригинала. И я сделал то же самое.

Моя модель домена остается прежней:

public class Person
{
    public virtual Guid Id { get; private set; }
    public virtual Gender Gender { get; set; }
    public virtual IEnumerable<Person> Children { get; set; }
}

Класс сущности для сопоставления:

public class PersonEntity : Person
{
    public virtual IList<Person> FatherChildren { get; set; }
    public virtual IList<Person> MotherChildren { get; set; }

    public override IEnumerable<Person> Children
    {
        get
        {
            return Gender == Domain.Gender.Male ? FatherChildren : MotherChildren;
        }
    }
}

И отображение немного изменено для производного класса:

public class PersonMap : ClassMap<PersonEntity>
{
    public PersonMap()
    {
        Table("People");

        Id(x => x.Id)
            .GeneratedBy.Guid();

        HasMany<PersonEntity>(x => x.FatherChildren)
            .KeyColumn("FatherId")
            .Inverse()
            .ReadOnly();

        HasMany<PersonEntity>(x => x.MotherChildren)
            .KeyColumn("MotherId")
            .Inverse()
            .ReadOnly();

        Map(x => x.Gender);
    }
}

Теперь у меня есть чистая модель!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...