Хорошие отношения с NHibernate всегда зависят от твердой приверженности OO и в большинстве общих случаев зависят от исключительности изменений данных. Если у вас его нет, вы увидите некоторые неприятные проблемы и откажетесь от большинства действительно хороших вещей, которые мог бы предложить NH.
Допустим, есть класс с именем "Foo", сопоставленный с таблицей "Foo" со столбцами "Id" и "SomeProperty". Если во всех строках «SomeProperty» вручную обновлено со «oldValue» до «newValue» и NH отправляет некоторый запрос в БД с запросом всех Foo, где SomeProperty = «newValue», БД возвращает все Foos, как и ожидалось. Но экземпляры Foo, предоставляемые NH, могут иметь «oldValue», потому что Foo с возвращенным идентификатором уже был присоединен к сеансу (другими словами, он был в кеше 1-го уровня).
Единственный короткий способ сообщить NHibernate обо всех обновлениях вручную - использовать StatelessSesion, поэтому он не будет кэшировать экземпляры объектов и всегда будет предоставлять версию данных БД. Но если вы хотите применить это в транзакционной системе, это явный признак неправильного использования NH, и вы не получите большинство хороших функций NH.