4

我已经搜索了很多地方,但仍然找不到我正在寻找的答案。

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

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

干杯,

詹姆士

4

1 回答 1

13

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

  • 插入父级时,子级也被插入。
  • 删除父级时,子级也被删除。
  • Update 在 NH 中是特殊的,但这也意味着当调用父级的 update 时,子级也被“更新”了。
  • 等等

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

有级联删除孤儿。

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

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

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

“foreach child delete”是可以的。当孩子不再使用并需要删除时,您可能需要这样做才能告诉 NH。

于 2012-08-31T07:34:05.277 回答