NHibernate中的继承映射与不同的命名Id列

时间:2012-12-07 08:07:24

标签: nhibernate mapping class-table-inheritance

我有三个共享很多列的表,所以我想用继承来映射它们,让我的数据层多一点OOP,DRY等等。在NHibernate手册中提到的所有三种继承映射策略(每个类层次表,每个子类的表和每个具体类的表)中,超类(或公共接口)与所有派生子类共有的Id映射。但我的表上的主键列都没有被称为相同。知道我怎么能映射这个?

在图表中:

TAXTYPE_1

  • clcpnd - >不同名称的Id列
  • clcnmb - >常见但命名不同的列
  • clcprc - >特定列,此表独有

TAXTYPE_2

  • rndind - >不同名称的Id列
  • rndamb - >常见但命名不同的列
  • rndorc - >特定列,此表独有

TAXTYPE_3

  • dasfnd - >不同名称的Id列
  • dastmb - >常见但命名不同的列
  • dascrc - >特定列,此表独有

(是的,我的专栏是这样命名的。旧系统。无法改变它。请立即杀了我)

编辑:我让架构更清晰。另外,我想让我的观点更清楚:三个表是相同类型的,我希望能够抽象实现公共字段的超类型,然后将细节写入每个子类。所以我有一个TaxType类和一个TaxType1,TaxType2和TaxType3子类,它们中的每一个都是“TaxType”。此外,这将使我的其他图层更容易使用,因为我使用单个TaxType存储库执行查询,依此类推。感谢Jamie Ide让我意识到问题有多严重。

2 个答案:

答案 0 :(得分:1)

使用继承是一个常见错误,因为您的对象共享属性。当您的对象具有共享行为和/或具有“is-a”关系(例如,汽车是车辆)时,继承是适当的。还要考虑如何查询对象;你需要查询基类并让NHibernate返回任何派生类吗?

在您的情况下,界面可能是更好的选择。这也解析了不同名称的Id列,因为您可以定义一个名为Id的属性来访问实际列。

public interface IMyEntity
{
    int Id { get; set; }
}

public class MyClass : IMyEntity
{
    public int Clcnmb { get; set; }
    public int Id
    { 
        get { return Clcnmb; }
        set { Clcnmb = value; }
    }
}

答案 1 :(得分:1)

正如评论中所讨论的:此处的问题是现有的 ID生成策略。虽然可以在所有表​​中使用ID的一个(例如1),但无法使用NHibernate继承机制

基类抽象类TaxType需要在其子类型中使用唯一ID,以区分每个实例。