Я знаю, что вы ответили на свой вопрос в комментарии к вопросу, но для краткого изложения приведем несколько общих моментов.
Просто чтобы уточнить, NHibernate использует 'save' как в 'SQL INSERT' и 'update' как в 'SQL UPDATE'.
Мне известны следующие распространенные сценарии, когда NHibernate будет неявно извлекать объект (без явного использования s.Update) из БД перед его сохранением:
- На session_flush /action_commit (в зависимости от настроек), когда в отображении select-before-update установлено значение "true";
- Когда используется SaveOrUpdate и идентификатор экземпляра имеет значение, которое предполагает, что он существует в БД;
- До того, как s.Delete.
Как и в вашем примере, это может быть неочевидно, когда используются родительские-дочерние объекты (но простые правила остаются прежними), поскольку из кода может быть не очевидно, что потомки будут извлечены.