能否通过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
相关产品推荐
相关产品推荐

