为什么NHibernate逐个删除引用的对象,而不是使用外键?

时间:2011-07-29 20:16:22

标签: performance nhibernate one-to-many

我有简单的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没有使用父外键来清除集合?它似乎知道准备这样的查询的一切(哪个外键,什么值等)?

2 个答案:

答案 0 :(得分:2)

NHibernate 在某些情况下能够并且会这样做。

所有解释都是here

答案 1 :(得分:0)

NHibernate在删除子项之前发出NHibernate: UPDATE "Child" SET Parent_id = null WHERE Parent_id = @p0;@p0 = 1。由于有许多不是反转,父亲必须取消设置关联,然后将删除级联到子,因为chuild可能有其他级联设置必须删除。

然而,即使反向一次删除也不起作用。 NH似乎只是立即删除了元素/组件集合。

一个原因可能是孩子可能有用户定义的sqldeletes,额外的级联属性等等。 NH的最简单方法是简单地将删除级联到每个孩子。