0

モデルにはオブジェクトがあり、それをクラス X と呼びます。モデルには、プロパティとしてクラス X のインスタンスを持ち、A、B、C などと呼ぶ他のいくつかのクラスがあります。これは本質的に一対一です。各 X は 1 つの親クラスにのみ属することができるため、1 つのマッピング。データベース側でこの関係をマップするために、現在、テーブル A、B、および C の X テーブルへの外部キーを使用しています。NHibernate マッピングについては、A、B、および C のマッピングで現在使用しています。クラス:

ManyToOne(a => a.X, m => m.Cascade(Cascade.All));

これは主に、クラス X の保存、取得、および更新に機能します。NHibernateOneToOneマッピングを正しく機能させるには多くの問題がありました。問題は、永続クラス A を取得し、その X を X の新しいインスタンスに置き換えてから、その A インスタンスを保存すると、新しい X インスタンスがデータベースに書き込まれ、A 列の外部キーが更新されることです。しかし、古い X は削除されないため、孤立した X になります。

これらの孤立した X が自動的に削除されることを望みます。X は、適切に処理するためにカスケードを設定した他のテーブルとの独自の多くの関係を持つ複雑なクラスであるため、NHibernate にそれを実行してもらいたいと考えています。孤立した X を適切に削除するように SQL スクリプトを設定しています。行が長い。

クラス X にその親アイテムへの参照を配置することを含む解決策を回避しようとしています。これは、それが属することができる合計 5 つのクラスがあり、クラス A には X が 1 つ、クラス B には名前付きの X が 2 つあるなどの状況があるためです。プロパティなど

私がこれまでに試したこと:

DeleteOrphansマッピングへの追加ManyToOne- 機能しません

OneToOneマッピング - キーが他のテーブルにあることを本当に望んでおり、とにかくカスケード削除をサポートしていないようです。

次のことも考慮されます。

NHibernate は、更新や削除などが発生したときに何らかのトリガーを設定することさえサポートしていないようです。

どうやら、OneToManyとのManyToManyマッピングのみが をサポートDeleteOrphansしているため、実際のプロパティである種のリストまたはセットを使用し、getter と setter を使用して、モデルの残りの部分に対して通常のプロパティのように見せることができます。非常にハックに聞こえますが、X で他のクラスへの参照が必要になる場合があります。

データベース トリガー - SQL Server トリガーをこの方法で使用できるかどうかはまだ確認していませんが、非常に厄介な解決策のように思えます。

これを機能させる方法についてのアイデアはありますか?

4

1 に答える 1

0

ここで最終的に行った解決策は、X の新しいインスタンスがそれを保持するクラスのいずれにも割り当てられないようにすることです。代わりに、セッターにコードを追加して、X の新しいインスタンスを割り当てようとするたびに、既存の X の内容を実際にクリアし、それらすべてを新しい X の内容に置き換えます。 X にはコレクションが含まれているため、NHibernate のカスケード削除は、X の古い子アイテムを削除して新しいアイテムに置き換える際に適切に機能します。これは少し醜い解決策ですが、私たちが思いついた中で最も醜いものではありません。

于 2014-05-01T19:16:36.203 に答える