モデルにはオブジェクトがあり、それをクラス 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 トリガーをこの方法で使用できるかどうかはまだ確認していませんが、非常に厄介な解決策のように思えます。
これを機能させる方法についてのアイデアはありますか?