2012-01-13 4 views
0

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

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

Individual 
- IndividualID (int) 
... 

Organisation 
- OrganisationID (int) 
... 

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

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

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

    } 
} 

То, что я пытаюсь сделать, это отобразить UserDetailsID в объекте пользователя в правильной таблицы/сущности на основе значения в столбце UserType , Таким образом, он должен отображаться на личность, если UserType == «индивидуальный», а для организации - UserType == «организация». Можно ли сделать это с помощью Fluent NHibernate? И как это будет сделано?

ответ

0

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

Моя модель объект выглядит следующим образом:

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

И в сущности он будет затем ссылаться на соответствующую ссылку на Организацию или Индивидуума после первой проверки UserType.

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

Смежные вопросы