Ответ о транзакциях является правильным по случайности.Кроме того, случайность в том, что это проявляется как таковое, потому что вы используете что-то вроде IDENTITY
генератора, для которого требуется отключение базы данных при сохранении для получения удостоверения.
Вот что NHibernate делает, когдаВы устанавливаете save-update
каскад (или любой каскад, который подразумевает это) для ассоциации «многие ко многим», например:
Сохраните родительский объект.Это немедленно попадает в базу данных из-за стратегии идентификации.Коллекция "модифицирована" (потому что она новая), поэтому давайте посмотрим на ее членов.Этот шаг происходит только в том случае, если inverse
не установлено в родительском отображении отношения.Создайте запись в таблице ссылок для каждого из них.
Но подождите, некоторые из этих записей являются временными.Каскады установлены правильно, так что все в порядке - но для создания записи таблицы ссылок в сеансе нам нужен идентификатор этих дочерних элементов, поэтому давайте сохраним их немедленно.
Теперь все соответствующие объекты являются постоянными, исеанс имеет ожидающую вставку для всех записей в таблице ссылок.Сброс сеанса вызовет команды и создаст эти записи.
Когда вы заключаете код в транзакцию, фиксация транзакции сбрасывает сеанс, поэтому он создается при фиксации.Если вы используете генератор идентификаторов, который не требует обращения к БД, записи таблицы ссылок и сущности будут вставлены одновременно, поэтому вы не увидите «отключение», которое вы видите - еслисеанс никогда не сбрасывается, ничего не вставляется, а когда он сбрасывается, все вставляется.Если у вас ничего из этого нет, явная очистка сеанса создаст записи в таблице ссылок, и все будет хорошо.