You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过NHibernate代码映射实现按类型关联不同公司表?

基于CompanyType关联不同公司表的NHibernate C#代码映射实现

可行,可通过NHibernate的公式(Formula)结合多态关联实现,以下是具体实现方案:

1. 定义公司实体类

首先抽象出公司基类,再分别实现两种类型的公司子类:

public abstract class Company
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

public class CompanyTypeA : Company { }

public class CompanyTypeB : Company { }

2. 扩展User类(若需实体直接关联)

原User类需添加CompanyType属性映射到数据库字段,同时新增关联公司实体的属性:

public class User
{
    public virtual int Id { get; set; }
    public virtual int CompanyId { get; set; }
    public virtual string CompanyType { get; set; }
    public virtual Company Company { get; set; }
}

3. C#代码映射实现

公司类映射

通过子类映射指定对应的数据表:

public class CompanyMap : ClassMapping<Company>
{
    public CompanyMap()
    {
        Id(x => x.Id, m => m.Generator(Generators.Assigned));
    }
}

public class CompanyTypeAMap : SubclassMapping<CompanyTypeA>
{
    public CompanyTypeAMap()
    {
        Table("CompanyTypeA");
    }
}

public class CompanyTypeBMap : SubclassMapping<CompanyTypeB>
{
    public CompanyTypeBMap()
    {
        Table("CompanyTypeB");
    }
}

User类映射

使用Formula根据CompanyType字段动态关联对应公司表:

public class UserMap : ClassMapping<User>
{
    public UserMap()
    {
        Table("UserTable");
        Id(x => x.Id, m => m.Generator(Generators.Identity));
        Property(x => x.CompanyId);
        Property(x => x.CompanyType);

        ManyToOne(x => x.Company, m =>
        {
            m.Column("CompanyId");
            // 用CASE语句根据CompanyType匹配对应表的Id
            m.Formula("(SELECT CASE CompanyType WHEN 'A' THEN (SELECT Id FROM CompanyTypeA WHERE Id = CompanyId) WHEN 'B' THEN (SELECT Id FROM CompanyTypeB WHERE Id = CompanyId) END)");
            m.Class(typeof(Company));
        });
    }
}

补充说明

  • 若无需实体直接关联,仅需查询时关联,可通过HQL/Criteria手动拼接关联逻辑,无需扩展User类的Company属性。
  • 需确保CompanyType字段的值与CASE语句中的判断条件(如'A'/'B')完全匹配,同时保证两张公司表的Id无重复,避免关联歧义。

内容的提问来源于stack exchange,提问作者user2818842

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:35:14