Специально для ActiveRecord: если вы не измените SessionScope самостоятельно, AR по умолчанию для шаблона управления сеансом на сессии за звонок, где новая сессия создается для каждой операции ActiveRecordMediator.Таким образом, все объекты, которые вы извлекаете, уже отключены от родительского сеанса после их получения. Изменения не будут сохраняться до тех пор, пока вы не вызовете Save (или SaveAndUpdate или даже Update), которые в шаблоне сеанса за звонок создадут сеанс, присоедините объект, который вы сохраняете к этому сеансу, вызовите Save и затем удалите сеанс (вызывая Flush и, таким образом, запись изменений).
Когда вы используете AR таким образом, он делает именно то, что вам кажется нужным (т. Е. Никакие изменения не записываются, если вы явно не вызываете «Сохранить»). Но это явно противоречит ожидаемому поведению NHibernate, и вы не можете делать ленивую загрузку или получать много пользы из кеширования. Я использовал этот шаблон для некоторых веб-приложений, но они разработаны для активной загрузки, и довольно много постоянных объектов эффективно неизменяемы и статичны и могут быть загружены во время запуска в автономном режиме и кэшированы без подключения к любому сессия. Если ваше приложение не подходит для этой модели, то сеанс за звонок, вероятно, является плохой идеей.
Поскольку вы, кажется, используете шаблон UOW, вы не можете воспользоваться этим поведением. Таким образом, вы должны либо выселить объект из сеанса NHibernate (и получить доступ к реальному экземпляру ISession на самом деле не так просто, как кажется в AR), либо изменить способ работы вашего приложения, чтобы свойства сохраняемых объектов фактически не изменялись пока ваши бизнес-правила не будут проверены.
согласился, что работает, но затем я вызываю выселение по всему моему клиентскому коду. не идеально. –