0

私は次のシナリオを持っています (より良い説明のために、例は非常に単純化されています) データベースモデル 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 に列を追加することを防ぐことはできませんか?

ご回答ありがとうございます。

4

3 に答える 3

0

同様の問題が発生し、考えられる解決策の調査に時間を費やしました。冗長な列がなければ、これを行う方法を見つけることができませんでした。少し醜いですが、モデルクラスにロジックを組み込んで、2つの値の一貫性を保つことができます。

于 2011-03-31T23:32:23.530 に答える
0

非複合キーを使用するのは簡単です。

<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>
于 2011-04-01T07:05:51.830 に答える
0

同じ列が 2 回マップされているため、このエラーが発生していると思います。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">
于 2011-04-01T02:05:35.110 に答える