4

たくさんの場所を検索しましたが、探している答えが見つかりません。

NHibernate3.2を使用しています-コードによるマッピング

私は次のマッピングファイルを持っています:

public class ParentMapping: EntityMapping<Parent>
{
        public ParentMapping()
        {
            Set(x => x.Children, map =>
                                           {
                                               map.Cascade(Cascade.All);
                                               map.Inverse(true);
                                           }, r => r.OneToMany());
        }
}

public class ChildMapping: JoinedSubclassMapping<Child> // This is a subclass of something else.
{
        public RequiredSkillMapping()
        {
            ManyToOne(x => x.Parent, map => { map.NotNullable(true); });
        }
}

カスケード保存は正常に機能します。

session.Save(parent) will save the children and associate them correctly.

電話をかけようとすると:

var parent = session.Get<Parent>(1);
parent.Children.Clear();

session.Save(parent); or session.SaveOrUpdate(parent) or session.Update(parent)

エンティティは親に関連付けられたままです。

私はそれを呼び出すことによって機能させました:

foreach(var child in parent.Children)
{
session.Delete(child);
}

parent.Children.Clear();

親を救う方法があるのではないかと期待していましたか?

乾杯、

ジェームズ

4

1 に答える 1

13

カスケードとは、親に対する操作が子にカスケードされることを意味します。

  • 親を挿入すると、子も挿入されます。
  • 親を削除すると、子も削除されます。
  • 更新はNHで特別ですが、親でupdateを呼び出すときに、子も「更新」されることも意味します。
  • 等々

コレクション自体は親に属しているため、コレクションの変更は親とともに保存されます。ただし、子がコレクションに含まれなくなったときに子を削除する理由はありません。NHは、他の目的でそれらが必要かどうかを知ることができません。

カスケード削除オーファンがあります。

map.Cascade(Cascade.All | Cascade.DeleteOrphans)

これは、コレクションに含まれていて、コレクションから削除されたアイテムが削除されることを意味します。それはあなたの場合に役立つかもしれません。コレクションから削除した後は、アイテムを何にも使用できないことに注意してください。それらを別の親に追加することもできません。

NHに未使用のアイテムを自動的に正しく削除させるには、すべての場合に永続的なガベージコレクションが必要になります。これは非常に非効率的であり、NHによって実装されていません。

「foreachchilddelete」はOKです。これは、子供がもう使用されておらず、削除が必要な場合にNHに通知するために行う必要がある場合があります。

于 2012-08-31T07:34:05.277 に答える