Oracle 在Nhibernate中映射具有外键关系的复合主键

Oracle 在Nhibernate中映射具有外键关系的复合主键,oracle,nhibernate,nhibernate-mapping,composite-key,multiple-columns,Oracle,Nhibernate,Nhibernate Mapping,Composite Key,Multiple Columns,我工作的一家公司正在使用ERP,它的遗留数据库是Oracle。 到目前为止,我一直使用软件包(oracle存储过程)访问数据,但这些年来数据量一直在增长,现在我无法再管理它们了。 我试图用Nhibernate做一些实验,并开始映射一些表。 所有表都有复合主键。 简要说明: 表格顺序(表格名称:OCSAORH) OCHORDN(PK)=>OrderNumber OCHAMND(PK) OCHCOSC(PK)=>公司 奥奇克利 ... 表医嘱行(表名:OCSALIN) OCLORDN(PK)=>

我工作的一家公司正在使用ERP,它的遗留数据库是Oracle。 到目前为止,我一直使用软件包(oracle存储过程)访问数据,但这些年来数据量一直在增长,现在我无法再管理它们了。
我试图用Nhibernate做一些实验,并开始映射一些表。
所有表都有复合主键。 简要说明:

表格顺序(表格名称:OCSAORH

OCHORDN(PK)=>OrderNumber
OCHAMND(PK
OCHCOSC(PK)=>公司
奥奇克利
...

表医嘱行(表名:OCSALIN

OCLORDN(PK)=>OrderNumber
OCLAMND(PK
OCLCOSC(PK)=>公司
奥克林(PK)=>行号
OCLSSEQ(PK
OCLITMN

这是我的地图

订单

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="MvcOracleNhibernate"
                   namespace="MvcOracleNhibernate.Domain">
  <class name="Order" table="OCSAORH">
    <composite-id>
      <key-property name="Number" column="OCHORDN"></key-property>
      <key-property name="Ver" column="OCHAMND"></key-property>
      <key-property name="Company" column="OCHCOSC"></key-property>
    </composite-id>
    <property name="CustomerCode" column="OCHCLII" type="String" length="10"></property>
    <property name="Reference" column="OCHOCNO" type="String" length="25"></property>
    <property name="Date" column="OCHOCDT" type="Double"></property>
    <bag name="OrderLines" cascade="all-delete-orphan" generic="true" inverse="true" lazy="false">
      <key>
        <column name="OCLORDN" not-null="true"/>
        <column name="OCLAMND" not-null="true"/>
        <column name="OCLCOSC" not-null="true"/>
      </key>
      <one-to-many class="OrderLine" not-found="ignore"/>
    </bag>
  </class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="MvcOracleNhibernate"
                   namespace="MvcOracleNhibernate.Domain">
  <class name="OrderLine" table="OCSALIN">
    <composite-id>
      <key-property name="Number" column="OCLORDN"></key-property>
      <key-property name="Ver" column="OCLAMND" ></key-property>
      <key-property name="Company" column="OCLCOSC"></key-property>
      <key-property name="Line" column="OCLLINN"></key-property>
      <key-property name="Seq" column="OCLSSEQ"></key-property>
    </composite-id>
    <property name="Item" column="OCLITMN" type="String" length="19"></property>
    <property name="Quantity" column="OCLQTYP" type="Double"></property>
  </class>
</hibernate-mapping>
正如您所注意到的,select的最后3个字段(前缀为OCH而不是OCL的字段)不是OCSALIN表的成员;它们是OCSAORH的钥匙。
在花了1天时间阅读文档和示例后,我无法找出我做错了什么。

有人能帮忙吗

这是预期的行为。您正在多对一映射中定义外键。因此,列需要存在于正在定义的对象中

我想你想要这个

<many-to-one name="Order" class="Order" lazy="proxy">
  <column name="OCLORDN" not-null="true"/>
  <column name="OCLAMND" not-null="true"/>
  <column name="OCLCOSC" not-null="true"/>
</many-to-one>   


它就像一个符咒。谢谢你,亚兹。你有任何文件的链接,我可以在那里读到更多关于这些东西的东西吗?再次感谢。@vandalo我实际上是一个NHibernate用户,但它实际上是一个Hibernate端口,所以它们非常相似。我将从这里开始阅读参考手册,了解映射文件的工作原理。然后就是练习,练习,练习;)谢谢。我已经开始看官方文件了,但是我没有时间看整份文件。有很多技巧和事情要知道。@vandalo如果有一章要读的话,那就是第5章:基本O/R映射
SELECT 
    orderlines0_.OCLORDN as OCLORDN1_, 
    orderlines0_.OCLAMND as OCLAMND1_, 
    orderlines0_.OCLCOSC as OCLCOSC1_, 
    orderlines0_.OCLLINN as OCLLINN1_, 
    orderlines0_.OCLSSEQ as OCLSSEQ1_, 
    orderlines0_.OCLORDN as OCLORDN13_0_, 
    orderlines0_.OCLAMND as OCLAMND13_0_, 
    orderlines0_.OCLCOSC as OCLCOSC13_0_, 
    orderlines0_.OCLLINN as OCLLINN13_0_, 
    orderlines0_.OCLSSEQ as OCLSSEQ13_0_, 
    orderlines0_.OCLITMN as OCLITMN13_0_, 
    orderlines0_.OCLQTYP as OCLQTYP13_0_, 
    orderlines0_.OCHORDN as OCHORDN13_0_, 
    orderlines0_.OCHAMND as OCHAMND13_0_, 
    orderlines0_.OCHCOSC as OCHCOSC13_0_ 
FROM OCSALIN orderlines0_ 
WHERE 
    orderlines0_.OCLORDN=? 
    and orderlines0_.OCLAMND=? 
    and orderlines0_.OCLCOSC=?
<many-to-one name="Order" class="Order" lazy="proxy">
  <column name="OCLORDN" not-null="true"/>
  <column name="OCLAMND" not-null="true"/>
  <column name="OCLCOSC" not-null="true"/>
</many-to-one>