【问题标题】:Map column to different table based on column value根据列值将列映射到不同的表
【发布时间】:2016-01-07 01:56:15
【问题描述】:

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

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 == “个人”,它应该映射到个人,如果 UserType == “组织”,它应该映射到组织。 使用 Fluent NHibernate 可以做到这一点吗?那该怎么做呢?

【问题讨论】:

    标签: fluent-nhibernate


    【解决方案1】:

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

    我的实体模型如下所示:

    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 之后调用对组织或个人的适当引用。

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

    【讨论】:

      【解决方案2】:

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

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

      祝你好运

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-21
        • 2021-08-21
        • 1970-01-01
        相关资源
        最近更新 更多