У меня есть иерархия объектов следующим образом:
Основываясь на других сообщениях здесь, я установил сопоставление Report.ReportItems в значение Inverse и CascadeAllDeleteOrphan. Это делает так, что когда я удаляю Report из Object, он удаляет ReportItems в этом отчете.
То, как это происходит, очень неэффективно. Это в основном делает Delete ... Where ReportItemID = ?
.
Я видел предложения увеличить размер пакета, чтобы предотвратить это в слишком большом количестве циклов, но это похоже на неаккуратное исправление. Есть ли способ заставить NHibernate генерировать такой запрос вместо этого:
Delete ... Where ReportID = ?
Таким образом он будет выполнять один запрос, который удалит все элементы ReportItems вместо одного оператора на элемент ReportItem.
Заранее спасибо.
Редактировать
Я слышал от нескольких людей, что NHibernate просто не будет работать таким образом со стандартным QueryOver и т. Д.
Я решил начать использовать HQL, чтобы исправить проблему. Позже я воспользуюсь отражением, чтобы убедиться, что «магические струны» не используются.
У меня была идея:
- Использование HQL для массового удаления элементов отчета
- Скажите сеансу обновить объект, чтобы он мог обнаружить, что элементы отчета пропали
- Затем скажите сеансу стереть отчет, и пусть он очистит оставшуюся информацию
Это не работает, хотя. Вы можете увидеть код ниже:
Session.CreateQuery("delete ReportItem r where r.Report= :report").SetEntity("report", SelectedReport).ExecuteUpdate()
Session.Refresh(SelectedReport)
Object.Reports.Remove(SelectedReport)
Session.Delete(SelectedReport)
Session.Update(Object)
Я также пытался сделать Session.Evict
после выполнения операторов HQL, но NHibernate продолжает использовать кеш для попытки удаления элементов ReportItems. Любые советы, как это сделать?