NHibernate Cascade在清除集合时删除子项

Jam*_*mez 4 nhibernate cascade nhibernate-mapping nhibernate-cascade

我搜索了很多地方,仍然无法找到我正在寻找的答案.

我正在使用NHibernate 3.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); });
        }
}
Run Code Online (Sandbox Code Playgroud)

级联保存工作正常.

session.Save(parent) will save the children and associate them correctly.
Run Code Online (Sandbox Code Playgroud)

当我试着打电话时:

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

session.Save(parent); or session.SaveOrUpdate(parent) or session.Update(parent)
Run Code Online (Sandbox Code Playgroud)

实体保持与父母相关联.

我通过调用它来工作:

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

parent.Children.Clear();
Run Code Online (Sandbox Code Playgroud)

我希望有一种方法可以拯救父母?

干杯,

詹姆士

Ste*_*ger 13

级联意味着父级上的操作级联到子级.

  • 插入父项时,也会插入子项.
  • 删除父项时,也会删除子项.
  • 更新在NH中是特殊的,但它也意味着在与父级调用更新时,子项也会"更新".
  • 等等

集合本身属于父集合,因此集合上的更改与父集合一起存储.但是当他们不在收集中时,没有理由删除他们.NH无法知道您是否需要其他任何东西.

有级联删除孤儿.

map.Cascade(Cascade.All | Cascade.DeleteOrphans)
Run Code Online (Sandbox Code Playgroud)

这意味着已从集合中删除并从集合中删除的项目将被删除.它可能对您的情况有用.请注意,从集合中删除后无法使用任何项目.您甚至无法将它们添加到另一个父级.

为了使NH在每种情况下自动正确地删除未使用的项目,需要持久的垃圾收集.这非常低效,并且不由NH实施.

"foreach child delete"是可以的.当孩子们不再使用并且需要删除时,你可能必须要告诉NH.