3

多対多の関係を持つ2つのクラスがあります。私がしたいのは、一方の側のみを削除すると、どちらの側を削除しても関連レコードが削除されるということです。

単純化されたモデル:

クラス:

class Qualification
{
     IList<ProfessionalListing> ProfessionalListings 
}

class ProfessionalListing
{
     IList<Qualification> Qualifications

     void AddQualification(Qualification qualification)
     {
        Qualifications.Add(qualification);
        qualification.ProfessionalListings.Add(this);
     } 
}

オーバーライドによる流暢な自動マッピング:

void Override(AutoMapping<Qualification> mapping)
{
     mapping.HasManyToMany(x => x.ProfessionalListings).Inverse();
}

void Override(AutoMapping<ProfessionalListing> mapping)
{
    mapping.HasManyToMany(x => x.Qualifications).Not.LazyLoad();
}

カスケード設定と逆設定のさまざまな組み合わせを試していますが、そこに到達できません。カスケードも逆もない場合、コレクション内にエンティティが重複します。片側に逆を設定すると重複がなくなりますが、資格を削除しようとすると、「削除されたオブジェクトはカスケードによって再保存されます」というメッセージが表示されます。

どうすればいいですか?

削除する各オブジェクトの関連付けをクリアする責任はありますか?

4

2 に答える 2

2

多対多テーブルは、実際にはリスト (ProfessionalListingsおよびQualifications) の永続的な形式です。オブジェクトの 1 つを削除すると、それは他のオブジェクトのリストに残りますね。

NHibernate がリストを更新することを期待することはできません。たとえば、データベース内の資格を削除した場合、そこでは資格を削除していないため、その資格は資格のリストに残ります。NHibernate はリストを更新しません (許可されるべきではありません)。

ProfessionalListingsは逆リストです。これは、ロードされるだけで、保存されないことを意味します。Qualifications資格が削除されたら、少なくともリストを更新する必要があります。これは、ビジネス ロジックによって管理されるクラス モデル内での通常の一貫性です。

于 2010-06-04T09:28:53.587 に答える
0

接続されたオブジェクトを削除する必要がある場合は、AllDeleteOrphanカスケード設定を構成できます。次に、関連付けからオブジェクトを削除すると、オブジェクトが削除されます

于 2010-04-29T12:19:48.560 に答える