簡體   English   中英

NHibernate-如何使用父子引用映射Composite-ID

[英]NHibernate - How to map composite-id with parent child reference

我有以下情形(為了更好地說明,該示例非常簡化) 數據庫模型 BAS_COSTCODE引用了BAS_CONTEXT。 該表的鍵是帶有COSTCODEID和CONTEXT_FK的組合。 CONTEXT_FK是指BAS_CONTEXT。 要構建分層樹,CostCode可以有一個父級。 因此,對表本身有一個引用。

上下文的模式文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="dbo" assembly="App.NHibernate.DataObjects" namespace="App.NHibernate.DataObjects">
      <class name="App.NHibernate.DataObjects.Context" table="BAS_CONTEXT" lazy="false" mutable="true" >
        <id name="Id" type="Int16" column="CONTEXTID" >
          <generator class="assigned"/>
        </id>
        <property name="Name" column="NAME" type="String" not-null="true"/>
       </class>
    </hibernate-mapping>

CostCode的架構如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="dbo" assembly="App.NHibernate.DataObjects" namespace="App.NHibernate.DataObjects">
  <class name="App.NHibernate.DataObjects.CostCode" table="CON_COSTCODE" mutable="true" >

    <composite-id name="CompositeId" class="CostCodeId" unsaved-value="any">
      <key-property name="Id" column="COSTCODEID" type="String" />
      <key-many-to-one name="Context" column="CONTEXT_FK" class="Context" lazy="proxy"/>
    </composite-id>

    <many-to-one name="ParentCostCode" class="CostCode" lazy="proxy" insert="true" update="true" >
      <column name="PARENTCOSTCODE_FK"/>
      <column name="CONTEXT_FK"/>
    </many-to-one>

    <property name="Name" column="NAME" type="String"/>
  </class>
</hibernate-mapping>

如果我創建一個新的CostCode實體並運行Commit(),則會收到以下異常: System.IndexOutOfRangeException:“此SqlParameterCollection的索引13為無效的索引13。”

我認為NHibernate在引用ParentCostCode時遇到了問題,它引用了父CostCode對象。 NHIbernate假定將值寫入PARENTCOSTCODE_FK列和CONTEXT_FK。 在映射中,composite-id指向CONTEXT_FK,而ParentCostCode指向CONTEXT_FK。 因此,它們“共享”同一列,並且NHibernate應該僅將值寫入列PARENTCOSTCODE_FK。

一種解決方案是在表BAS_COSTCODE中添加一個額外的列(可能是PARENTCONTEXT_FK)以表示父對象的Context。 但是我不想再增加一列,因為如果存在對父對象的引用,那么CONTEXT_FK和PARENTCONTEXT_FK的值必須具有相同的值。 那將是多余的。

是否有針對此類問題的更好解決方案? 還是我無法阻止BAS_COSTCODE中的其他列?

預先非常感謝您的回答!

我們遇到了類似的問題,並花了一些時間研究可能的解決方案。 如果沒有多余的列,我們將找不到解決方案。 這有點丑陋,但您可以在模型類中加入一些邏輯以強制兩個值保持一致。

我認為發生此錯誤是因為您將同一列映射了兩次。 CONTEXT_FK

<many-to-one name="ParentCostCode" class="CostCode" lazy="proxy" insert="true" update="true" >
  <column name="PARENTCOSTCODE_FK"/>
  <column name="CONTEXT_FK"/>
</many-to-one>

您可能想要嘗試解決此問題:

<many-to-one name="ParentCostCode" class="CostCode" lazy="proxy" insert="false" update="false">

直接使用非復合鍵。

<id>
  <generator class="hilo">
     <!-- ... -->
  </generator>
</id>

<property name="CostCode" column="COSTCODEID" unique-key="CostCodeContext"/>

<many-to-one name="Context" >
  <column name="CONTEXT_FK" unique-key="CostCodeContext"> 
</many-to-one> 

<many-to-one name="Parent" class="CostCode">
  <column name="PARENT_FK"/>
</many-to-one>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM