【问题标题】:Inheritance mapping in NHibernate with different named Id columnsNHibernate 中具有不同命名 Id 列的继承映射
【发布时间】:2012-12-07 08:07:24
【问题描述】:

我有三个共享很多列的表,所以我想使用继承来映射它们并使我的数据层更加 OOP、DRY 等等。在 NHibernate 手册中提到的所有三种继承映射策略(每个类层次结构的表、每个子类的表和每个具体类的表)中,超类(或公共接口)使用所有派生子类通用的 Id 进行映射。但是我的表上没有一个主键列被称为相同的。知道如何映射吗?

在图表中:

TAXTYPE_1

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

TAXTYPE_2

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

TAXTYPE_3

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

(是的,我的专栏是这样命名的。旧系统。无法更改。现在请杀了我)

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

【问题讨论】:

  • 只是为了确定:ID 在表中是唯一的吗?它们现在是如何生成的?
  • 它们是自动序列整数,在自己的表中是唯一的。我的意思是,有一个 TAXTYPE_1.clcpnd = 1 和一个 TAXTYPE_2.rndind = 1 和一个 TAXTYPE_3.dasfnd = 1。
  • 在这种情况下,当相同的ID 值可能属于不同的子类型 时,您无法从NHibernate 继承功能中获益。当使用 superclass TaxType 来区分实例时,根本不会有唯一标识符。

标签: nhibernate mapping class-table-inheritance


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    使用继承是一个常见的错误,因为您的对象共享属性。当您的对象具有共享行为和/或具有“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; }
        }
    }
    

    【讨论】:

    • 我将用更多信息更新问题,因为您已经明确表示我的问题没有明确说明我的意图和问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    相关资源
    最近更新 更多