我搜索了很多地方,仍然无法找到我正在寻找的答案。
我正在使用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();
我希望能有一种方法来保存父母吗?
干杯,
詹姆斯
答案 0 :(得分:13)
Cascade意味着父级上的操作会级联到子级。
集合本身属于父集合,因此集合上的更改与父集合一起存储。但是当他们不在收集中时,没有理由删除他们。 NH无法知道您是否需要其他任何东西。
有级联删除孤儿。
map.Cascade(Cascade.All | Cascade.DeleteOrphans)
这意味着已从集合中删除并从集合中删除的项目将被删除。它可能对您的情况有用。请注意,从集合中删除后无法使用任何项目。您甚至无法将它们添加到另一个父级。
要使NH在每种情况下自动正确删除未使用的项目,都需要持久的垃圾回收。这是非常低效的,并没有由NH实施。
“foreach child delete”是可以的。当孩子们不再使用并且需要删除时,你可能必须要告诉NH。