2010-07-19 3 views
0

После того как я получаю объект, я изменяю его свойство. Затем я получаю одно и то же сущность.NHibernate FlushMode: как настроить NHibernate для автоматического обновления объекта

Как сказать Nhibernate, что он должен обновить объект до того, как он загрузит объект?

Вот код:

EmployeeRepository employeeRepository = new EmployeeRepository(); 
Employee employee = employeeRepository.GetById(4); 
employee.LastName = "TEST!!!"; 
Employee employee2 = employeeRepository.GetById(4); 

В настоящее время Nhibernate не сделать обновление в моей программе. Я думал, что просто установка FlushMode в Auto автоматически обновит объект.

EDIT Основой является то, что я пытаюсь воспроизвести это поведение в другом приложении. Нет способа сохранения! Только этот код. Версия NHibernate действительно старая, это версия 1.2.1.4000. возможно, есть улов.

Когда я установил FlushMode в приложении с коричневым полем для Commit, то никакой инструкции обновления не генерируется.

Но в моем собственном проекте я до сих пор не могу воспроизвести это «автоматическое» поведение.

ответ

3

Есть ли оба обращения к сотрудникуRepository в конечном счете с использованием того же NHibernate ISession экземпляра? Если это так, то они возвратят тот же объект, и будет обновлено значение LastName. Если нет, то вам нужно будет убедиться, что вы каждый раз удаляете свой экземпляр ISession, чтобы воспользоваться функцией автоматической промывки.

+0

, пожалуйста, посмотрите на мое редактирование – Rookian

+0

, поэтому, когда я использую тот же «ISeesions», NHibernate автоматически вызовет оператор sql update, потому что у меня установлен FlushMode для авто? – Rookian

+0

Нет, он будет кэшировать измененный объект в памяти. –

1

Согласно the documentation для FlushMode по умолчанию Авто:

ISession иногда продувает перед выполнением запроса, чтобы гарантировать, что запросы не возвращаются несвежее состояния. Это режим сброса по умолчанию.

Таким образом, вы должны вручную очистить сеанс, чтобы ваши изменения сохранялись до того, как вы снова прочитали объект.

EmployeeRepository employeeRepository = new EmployeeRepository(); 
Employee employee = employeeRepository.GetById(4); 
employee.LastName = "TEST!!!"; 
session.Flush(); 
Employee employee2 = employeeRepository.GetById(4); 

Если ваше хранилище использует тот же ISession для обоих вызовов (как это должно имо), то сотрудник 4 будет извлекаться из кэша и имеют изменения. Однако это изменение еще не сохранилось в базе данных.

Если ваш метод GetById вашего репозитория использует новый сеанс для каждого вызова, он всегда попадает в базу данных для извлечения сотрудника. Если вы удаляете сеанс в методе, тогда ваши объекты возвращаются как отключенные от сеанса. Эта стратегия побеждает цель NHibernate и переносит ее на простой инструмент для доступа к данным.

+0

«ISession иногда покраснели» Что значит иногда: D? Ну, когда Nhibernate вызывает обновление sql-инструкции? Я не понял этого правильно. – Rookian

+0

Я не знаю с уверенностью. Я ожидаю, что если вы извлекли и изменили сотрудника, а затем сделали выбор в таблице, NHibernate сначала очистит сеанс, чтобы запрос возвращал согласованные результаты. Это может работать, только если операции выполняются в одном сеансе. Получение объекта по первичному ключу - это другая история; в этом случае NHibernate будет извлекать его из кеша. –

+0

Теперь я получил объект через API ICriteria, реализовав метод GetByName, но до сих пор нет инструкции по обновлению. У меня есть тот же сеанс, FlushMode = auto. Что я не так? – Rookian

Смежные вопросы