У меня есть простое 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 = ...
- это может означать действительно МНОГО запросов.
В любом случае, это может быть легко сделать с помощью одного запроса как DELETE FROM Child WHERE ParentId = 1
.Почему NHibernate не использует родительский внешний ключ для очистки коллекции?Кажется, он знает все, чтобы подготовить такой запрос (какой внешний ключ, какое значение и т. Д.)?