[英]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.