Если вы изучите _session.IsDirty()
перед совершением транзакции, моя ставка на то, что она вернет true. Когда транзакция зафиксирована, сеанс сбрасывается, и по какой-то причине дочерние объекты загружаются для каскадного изменения.
Эта проблема известна как «призрачные» или фантомные обновления. Типичный сценарий состоит в том, что столбец базы данных имеет значение NULL, но соответствующее свойство объекта не имеет значения NULL. Когда извлекается запись с нулевым значением, NHibernate устанавливает значение свойства в 0, и поэтому объект является грязным.
Самый быстрый способ устранения неполадок - включить динамическое обновление для объекта, используя dynamic-update="true"
в сопоставлениях XML, DynamicUpdate()
в свободном доступе, и использовать профилировщик или ведение журнала, чтобы увидеть, какие столбцы обновляются после выбора. Также есть утилита под названием Ghostbuster , которую вы можете включить в модульные тесты.