Fluent nhibernate 基于列值将列映射到不同的表

Fluent nhibernate 基于列值将列映射到不同的表,fluent-nhibernate,Fluent Nhibernate,我有以下数据库结构(无法更改): 用户表中的UserDetailsID列根据存储在UserType列(“个人”、“组织”)中的值引用个人或组织。 当然不是最好的数据库设计,但这是我们目前必须处理的问题 这是我们映射类的开始: public class UserMap : ClassMap<User> { public UserMap() { Table("Users"); LazyLoad(); Id(x => x

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

用户表中的UserDetailsID列根据存储在UserType列(“个人”、“组织”)中的值引用个人或组织。 当然不是最好的数据库设计,但这是我们目前必须处理的问题

这是我们映射类的开始:

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

    }
}
公共类用户映射:类映射
{
公共用户映射()
{
表(“用户”);
懒散的负荷();
Id(x=>x.UserID).GeneratedBy.Identity()列(“UserID”);
}
}
我试图做的是根据UserType列中的值将用户实体中的UserDetailsID映射到正确的表/实体。 因此,如果UserType==“个人”,它应该映射到个人;如果UserType==“组织”,它应该映射到组织。
用Fluent NHibernate可以做到这一点吗?如何做到这一点?

我自己想出了一个解决方案:

我的实体模型如下所示:

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();
在实体中,首先检查用户类型后,它将调用对组织或个人的适当引用


这对我来说似乎很好,但如果有人有更好的解决方案,请添加您的答案。

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

祝你好运

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