我有简单的Parent
- Child
关系,Parent
有很多Child
个对象,关系是单向的:
public class Parent
{
public virtual int Id { get; protected set; }
public virtual string Name { get; set; }
public virtual IList<Child> Children { get; set; }
}
public class Child
{
public virtual int Id { get; protected set; }
public virtual string Name { get; set; }
}
关系的映射将级联设置为AllDeleteOrphan
以删除Child
未引用的Parent
个对象:
HasMany(x => x.Children).Cascade.AllDeleteOrphan();
现在我正在清除Child
个对象列表:
var parent = session.Get<Parent>(1);
parent.Children.Clear();
session.Update(parent);
NHibernate按预期删除Child
对象,但是它通过从集合中发送单独的DELETE查询来实现此目的:Child
- 这可以意味着很多疑问。
无论如何,使用DELETE FROM Child WHERE Id = ...
之类的单一查询可以轻松完成。为什么NHibernate没有使用父外键来清除集合?它似乎知道准备这样的查询的一切(哪个外键,什么值等)?
答案 0 :(得分:2)
NHibernate 在某些情况下能够并且会这样做。
所有解释都是here。
答案 1 :(得分:0)
NHibernate在删除子项之前发出NHibernate: UPDATE "Child" SET Parent_id = null WHERE Parent_id = @p0;@p0 = 1
。由于有许多不是反转,父亲必须取消设置关联,然后将删除级联到子,因为chuild可能有其他级联设置必须删除。
然而,即使反向一次删除也不起作用。 NH似乎只是立即删除了元素/组件集合。
一个原因可能是孩子可能有用户定义的sqldeletes,额外的级联属性等等。 NH的最简单方法是简单地将删除级联到每个孩子。