私は次のシナリオを持っています (より良い説明のために、例は非常に単純化されています) データベースモデル BAS_COSTCODE は BAS_CONTEXT を参照します。このテーブルのキーは、COSTCODEID と CONTEXT_FK の複合です。CONTEXT_FK は BAS_CONTEXT を参照します。階層ツリーを構築するために、CostCode は親を持つことができます。このため、テーブル自体への参照があります。
Context のスキーマ ファイルは次のようになります。
<?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() を実行すると、次の例外が発生します 。
NHibernate は、親の CostCode オブジェクトを参照する ParentCostCode の参照に問題があると思います。NHIbernate は、列 PARENTCOSTCODE_FK と CONTEXT_FK に値を書き込むことを前提としています。マッピングでは、composite-id が CONTEXT_FK を指し、ParentCostCode が CONTEXT_FK を指します。したがって、それらは同じ列を「共有」しており、NHibernate は列 PARENTCOSTCODE_FK にのみ値を書き込む必要があります。
1 つの解決策は、追加の列 (おそらく PARENTCONTEXT_FK) をテーブル BAS_COSTCODE に追加して、親オブジェクトのコンテキストを表すことです。しかし、親オブジェクトへの参照が存在する場合、CONTEXT_FK と PARENTCONTEXT_FK の値は同じ値でなければならないため、追加の列は必要ありません。そして、それは冗長になります。
その種の問題に対するより良い解決策はありますか?または、BAS_COSTCODE に列を追加することを防ぐことはできませんか?
ご回答ありがとうございます。