6

シナリオは次のとおりです。

Parentという名前の 3 つのオブジェクト (名前を簡略化しました) があります。親の子と子の子、
親の子は親のセット、子の子は子のセットです。

マッピングは次のとおりです(関連部分)

<set name="parentset"
     table="pc-table"
     lazy="false"
     fetch="subselect"
     cascade="all-delete-orphan"
     inverse="true">
  <key column=FK_ID_PC" on-delete="cascade"/>
  <one-to-many class="parentchild,parentchild-ns"/>
</set>

親の子

<set name="childset"
     table="cc-table"
     lazy="false"
     fetch="subselect"
     cascade="all-delete-orphan"
     inverse="true">
  <key column="FK_ID_CC" on-delete="cascade"/>
  <one-to-many class="childschild,childschild-ns"/>
</set>

私が達成したいのは、親を削除すると、子の子までカスケード削除が行われることです。しかし、現在起こっていることはこれです。

(これは純粋にマッピング テスト目的のためです) 親エンティティを取得します (正常に動作します)

IQuery query = session.CreateQuery("from Parent where ID =" + ID);
IParent doc = query.UniqueResult<Parent>();

今削除部分

session.Delete(doc);
transaction.Commit();

カスケードと逆で「null値を挿入できません」というエラーを解決した後、このコードですべてが削除されることを願っていますが、親のみが削除されています。

見逃されそうなマッピングの何かを見落としていませんか? 正しい方向へのヒントは大歓迎です!


ディエゴ、要点を答えてくれてありがとう。(と説明)

これはon-delete="cascade"、データベースではなくコードで可能な限り多くの制御が必要なためです。

以下に投稿されたコードは、(動作中の) 結果です。

<set name="parentset"     
     table="pc-table"     
     cascade="all-delete-orphan"     
     inverse="true"
     batch-size="5">     
  <key column=FK_ID_PC"/>     
  <one-to-many class="parentchild,parentchild-ns"/>     
</set>

親の子

<set name="childset"            
     table="cc-table"     
     cascade="all-delete-orphan" 
     batch-size="5"  
     inverse="true">            
  <key column="FK_ID_CC">            
  <one-to-many class="childschild,childschild-ns"/>            
</set>

これが同じ問題を抱えている人々に役立つことを願っています!

4

1 に答える 1

6

キーを設定on-delete="cascade"することで、DB にカスケードを処理させます。

NHibernate でスキーマを生成していますか?

あなたの例を再現したところ、その属性の有無にかかわらず正常に機能しました。それを削除すると、NHibernate はカスケードを行います。

ところで、使用lazy="false" fetch="subselect"はデフォルトで行うべきことではありません。これらの属性を削除し、そのままon-delete="cascade"にして に変更cascadeするsave-updateと、親を取得および削除するためのクエリが 2 つだけになります。

于 2010-03-05T15:45:22.643 に答える