Сопоставить столбец с другой таблицей на основе значения столбца - PullRequest
0 голосов
/ 13 января 2012

У меня есть следующая структура базы данных (которую нельзя изменить):

Users
- UserID (int)
- UserType (varchar)
- UserDetailsID (int)

Individual
- IndividualID (int)
...

Organisation
- OrganisationID (int)
...

Столбец UserDetailsID в таблице «Пользователи» относится к отдельному лицу или организации на основе значения, сохраненного вСтолбец UserType («индивидуальный», «организационный»).Определенно, не лучший дизайн базы данных, но это то, с чем мы должны сейчас работать.

Это начало нашего класса отображения:

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Table("Users");
        LazyLoad();
        Id(x => x.UserID).GeneratedBy.Identity().Column("UserID");

    }
}

Что я пытаюсь сделатьдолжен сопоставить UserDetailsID в сущности User с правильной таблицей / сущностью на основе значения в столбце UserType.Таким образом, он должен отображаться на Индивидуальный, если UserType == "индивидуальный", и на Организацию, если Пользовательский тип == "организация".Возможно ли это сделать с помощью Fluent NHibernate?И как это будет сделано?

Ответы [ 2 ]

0 голосов
/ 16 января 2012

Да, я думаю, что есть другой способ, если вам это нравится. Не уверен насчет перевода FluentNhibernate.

http://nhibernate.info/doc/nh/en/index.html#inheritance-tablepersubclass-discriminator

Удачи

0 голосов
/ 13 января 2012

Я сам придумал одно решение:

Моя модель сущности выглядит так:

public class User
{
    public User() { }

    public virtual int UserID { get; set; }
    public virtual string UserType { get; set; }

    public virtual bool IsIndividual
    {
        get { return UserType == "Individual"; }
    }

    public virtual bool IsOrganisation
    {
        get { return UserType == "Organisation"; }
    }

    private Individual _individual;
    public virtual Individual Individual 
    {
        get { return (IsIndividual ? _individual : null); }
        set { _individual = value; } 
    }

    private Organisation _organisation;
    public virtual Organisation Organisation
    {
        get { return (IsOrganisation ? _organisation : null); }
        set { _organisation = value; }
    }
}

А потом я дважды сопоставил столбец UserDetailsID, но с ленивой загрузкой:

Map(x => x.UserType).Column("UserType");
References(x => x.Individual).Column("UserDetailsID").LazyLoad();
References(x => x.Organisation).Column("UserDetailsID").LazyLoad();

А в сущности он будет вызывать соответствующую ссылку на организацию или частное лицо после проверки типа пользователя.

Мне кажется, это работает нормально, но если у кого-то есть лучшее решение, пожалуйста, добавьте свой ответ.

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