我已经使用cascade =“all-delete-orphan”映射了子集合并尝试了
var parent = session.Load<Parent>(id);
session.Delete(parent);
但它还会在删除之前加载父级及其所有子级。 有没有办法删除父项和子项而不加载它们或至少只加载父项?
答案 0 :(得分:1)
我不是NHibernate的专家,我仍然非常了解它。我有待纠正,但默认情况下没有NHibernate延迟加载,即Parent.Child只会在访问时初始化(并加载数据)。
删除Parent时,使用all-delete-orphan设置的关系模型意味着在删除Parent时必须先删除与Parent相关的Child成员。这可以解释为什么他们被装载。
如果您出于性能原因试图避免加载Children,可能会为此特殊情况实现自己的SQL。
答案 1 :(得分:0)
这很简单,只需在数据库上使用级联删除即可。如果这不是使用在数据库级别上运行的自定义查询的选项,或者只是使用此方法。
NHibernate无法通过查询来执行此操作,它需要检索每个单独的行以进行删除,因为它需要行的键来删除它们。这就是使这个变得昂贵的原因。
只需在数据库上使用级联删除即可。这是数据库擅长的东西。