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

Performance 为什么NHibernate不使用外键逐个删除引用的对象?,performance,nhibernate,one-to-many,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 {

我有简单的
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; }
}
现在我正在清除
Child
对象列表:

var parent = session.Get<Parent>(1);
parent.Children.Clear();
session.Update(parent);
var parent=session.Get(1);
parent.Children.Clear();
更新(家长);
NHibernate按预期删除
子对象
,但它通过从集合中为每个
子对象发送单独的删除查询
DELETE from Child,其中Id=…
-这可能意味着大量查询


无论如何,使用单个查询就可以轻松地完成,就像
从ParentId=1的子级删除一样。为什么NHibernate不使用父外键清除集合?似乎它知道准备这样的查询的一切(哪个外键、什么值等)?

NHibernate在某些情况下可以并且将要这样做


这一切都解释清楚了。

NHibernate发布了一个
NHibernate:UPDATE“Child”SET Parent\u id=null,其中Parent\u id=@p0@删除孩子之前,p0=1
。由于has many不是反向的,父级必须取消关联,然后将删除级联到子级,因为chuild可能设置了其他必须删除的级联

但是,即使使用反向单次删除也不起作用。NH似乎只在元素/组件集合中一次删除


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

“NHibernate并不完全愚蠢,因此它知道在新的空集合(例如,如果调用list.Clear())的情况下不这样做。在这种情况下,NHibernate将发出单个删除,我们就完成了!”-好,我的问题就是这样,我有一个接一个的删除。虽然我的关系不是反向的,但它是单向的,怎么可能是反向的呢?我试图用反向复制一次删除,但无法使其工作。我在
Child
中添加了
Parent-Parent{get;set;}
,映射为
引用(x=>x.Parent)
并将
.Inverse()
添加到
父项中的
子项
集合中。我正在设置
child.Parent
以及将
child
添加到
Parent.Children
集合中。仍然在一个接一个地删除。@A:这很有趣。我也不能让它工作。想在nhusers组中提问吗不是很大的反应。
var parent = session.Get<Parent>(1);
parent.Children.Clear();
session.Update(parent);