清除集合时,在子对象上进行NHibernate级联删除



我找了很多地方,仍然找不到我想要的答案。

我正在使用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); });
        }
}

级联保存工作正常。

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();

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

干杯,

James

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

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

集合本身属于父级,因此对集合的更改将与父级一起存储。但是,当孩子们不再在收藏中时,没有理由删除他们。NH不知道你是否需要它们来做其他事情。

存在级联删除孤立项。

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

这意味着已在集合中并从集合中删除的项目将被删除。这可能对你有用。请注意,从集合中删除后,不可能将项用于任何内容。你甚至不能将它们添加到另一个家长中。

要使NH在任何情况下都能正确地自动删除未使用的项目,就需要持久的垃圾收集。这是非常低效的,NH没有实现。

"foreach child delete"是可以的。当孩子们不再使用并且需要删除时,你可能需要这样做来告诉NH。

相关内容

  • 没有找到相关文章

最新更新