根据列值将列映射到不同的表

时间:2012-01-13 10:35:17

标签: fluent-nhibernate

我有以下数据库结构(无法更改):

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

Individual
- IndividualID (int)
...

Organisation
- OrganisationID (int)
...

Users表中的UserDetailsID列根据UserType列(“个人”,“组织”)中存储的值引用个人或组织。 绝对不是最好的数据库设计,但这是我们现在必须要合作的。

这是我们的映射类的开始:

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

    }
}

我要做的是根据UserType列中的值将User实体中的UserDetailsID映射到正确的表/实体。 因此,如果UserType ==“individual”,它应映射到Individual;如果UserType ==“organization”,它应映射到Organization。 是否可以使用Fluent NHibernate进行此操作?那会怎么做?

2 个答案:

答案 0 :(得分: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后调用对Organization或Individual的适当引用。

这似乎对我有用,但如果有人有更好的解决方案,请添加你的答案。

答案 1 :(得分:0)

是的,我认为如果你喜欢它还有另外一种方法。关于FluentNhibernate的翻译不确定。

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

祝你好运