Nhibernate 如何使用具有不匹配列名的复合键映射联接的子类

Nhibernate 如何使用具有不匹配列名的复合键映射联接的子类,nhibernate,Nhibernate,我有两张桌子,比如: PAYMENT ------------------------------ OrderId INT PK PaymentId INT PK Amount FLOAT ChildPaymentRowNum INT CARD_PAYMENT ------------------------------ OrderId INT PK PaymentRowNum

我有两张桌子,比如:

PAYMENT
------------------------------
OrderId             INT    PK
PaymentId           INT    PK
Amount              FLOAT
ChildPaymentRowNum  INT

CARD_PAYMENT
------------------------------
OrderId             INT    PK
PaymentRowNum       INT    PK
CardType            STRING

CHEQUE_PAYMENT
------------------------------
OrderId             INT    PK
PaymentRowNum       INT    PK
CheckNumber         INT
不,我没有做这个数据库,不,我不能改变它。我想将
CARD\u PAYMENT
check\u PAYMENT
映射为
PAYMENT
联接子类
es。这个模型与我发现的示例的不同之处在于,我使用的是复合键,并且外部表中的一个列名不匹配

我认为如果不是复合键,我可以这样做:

<joined-subclass name="CardPayment" table="CARD_PAYMENT" extends="Payment">
    <key column="PaymentRowNum" foreign-key="ChildPaymentRowNum">
</joined-subclass>
<joined-subclass name="CardPayment" table="CARD_PAYMENT" extends="Payment">
    <key>
        <column="OrderId">
        <column="PaymentRowNum">
    </key>
</joined-subclass>

如果组合键上的名称匹配,我可以这样做:

<joined-subclass name="CardPayment" table="CARD_PAYMENT" extends="Payment">
    <key column="PaymentRowNum" foreign-key="ChildPaymentRowNum">
</joined-subclass>
<joined-subclass name="CardPayment" table="CARD_PAYMENT" extends="Payment">
    <key>
        <column="OrderId">
        <column="PaymentRowNum">
    </key>
</joined-subclass>

但是,虽然我想做这样的事情,但我很确定这是违法的:

<!-- NO GOOD -->
<joined-subclass name="CardPayment" table="CARD_PAYMENT" extends="Payment">
    <key>
        <column="OrderId" foreign-key="OrderId">
        <column="PaymentRowNum" foreign-key="ChildPaymentRowNum">
    </key>
</joined-subclass>

那么,我该怎么做呢


附加值:如果您能告诉我如何使用
NHibernate.Mapping.Attributes
,但如果不能,我可能会想出来。

外键属性用于指定应由NHibernate架构生成工具创建的外键约束(而不是列!)的名称。它在运行时对NHibernate没有影响


为什么要在子类键中指定基类的键列名?即使是
联接子类的NHibernate文档
在两个表中都使用了不同的列名:

Hmm。。。好吧,我可能遗漏了一些东西,但我认为你的问题的答案是基类的(主键)键与表示关系的键不同。基类的主键是[
OrderId
PaymentId
],而表示子类关系的FK由[
OrderId
ChildPaymentRowNum
]组成。在这种情况下,我是否需要将后一对声明为基类上的某种键?@S'pht'Kr哦,对不起,我错过了PK不仅使用不同的列名,而且使用与子键完全不同的值的部分。我不知道你怎么能用NHibernate把它画出来。据我所知,NHibernate要求继承映射中的所有实体都具有相同的id。在我看来,DB模型是错误的。是的,我对DB不满意……这个例子是同一场景的伪造表示,真实的东西有点道理,但实际意义不大。如果这不可能,我只会有点惊讶,但这将是我第一次在NHibernate中发现不可能的东西!至少它比EntityFramework灵活得多,EntityFramework甚至不允许我定义复合键。