0

次のクラスと流暢なマップが与えられた私の他の質問に加えて、関連する人物が削除されたときに DriversLicense を自動的にカスケード削除する方法はありますか? Person クラスに DriversLicense クラスの知識を持たせたくありませんが、Person が削除された場合に孤立したデータも必要としません。

public class PersonMap : ClassMap<Person>
{
        public PersonMap() { Id( x => x.Id ); }
}

public class PersonMap : ClassMap<Person>
{
        public PersonMap() { Id( x => x.Id ); }
}

public class DriversLicense
{
        public virtual Person Person { get; set; }
        public virtual string State { get; set; }

        public override bool Equals( object obj ){ ... }
        public override int GetHashCode(){ ... }
}

public class DriversLicenseMap : ClassMap<DriversLicense>
{
        public DriversLicenseMap()
        {
                UseCompositeId().WithKeyReference( x => x.Person );
                Map( x => x.State );
        }
}
4

2 に答える 2

0

オブジェクトを構造化する方法でそれを行うことはできません。DriversLicenseをPersonクラスに追加したい場合は、カスケード削除できます。しかし、すでに述べたように、人物オブジェクトにDriversLicenseの知識を持たせたくはありません。

実際に行う必要があるのは、その人物を含むすべての運転免許証を取得してから、カスケード削除を使用してDriverLicensesを削除することです。これにより、人物レコードとライセンスが削除されます。

(最近、FNHスタックの多くの変更を追跡していないため、ある時点で名前が変更された可能性があります)マップを次のようなものに変更する必要があります。

public DriversLicenseMap()
{
        UseCompositeId().WithKeyReference( x => x.Person ).Cascade.All();
        Map( x => x.State );
}

編集:新しい情報が追加されたら、実際に行う必要があるのは、リポジトリクラスで設定します。ここで、個人の削除を処理して、その個人を持つすべての運転免許証の検索を実行します。ほとんどの場合、それを処理するためにCriteria式を作成する必要があります。

そのリストを取得したら、それらのオブジェクトをすべて削除し、それらの削除を確実にフラッシュした後、人物レコードを削除してフラッシュします。

孤立したデータを希望どおりに制約したくないこと、および運転免許証クラスをpersonクラス内に配置したくないことについて説明した状況では、(私の知る限り)どのタイプのカスケード削除でも処理できません。

于 2009-07-14T13:10:04.997 に答える
-1

ビジネス上の理由から、DriversLicense から Person に削除をカスケードすることはできません。また、DriversLicense について Person が何を知っているかを本当に知らず、この要件には本当に正当な理由があるため、次のいずれかで処理できると思います。ふたつのやり方:

  1. DriversLicense オブジェクトを削除する責任をサービスまたはリポジトリ レベルに移し、Chris が提案したことを実行します。Person エンティティを削除する前に、Person の DriverLicnese オブジェクトをクエリして削除します。

  2. 削除を実行する Nhibernate Interceptor または EventHandler を作成できます。このアプローチは、リポジトリとドメインをクリーンでクリーンな状態に保ちます。おそらく、person オブジェクトから DriveLicenese コレクションを参照できない場合にとるアプローチです。( NHibernate イベントのドキュメント)

于 2009-07-17T21:43:33.057 に答える