NHibernate FlushMode: как настроить NHibernate для автоматического обновления сущности - PullRequest
0 голосов
/ 19 июля 2010

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

Как мне сказать 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 в приложении brownfield для Commit, оператор обновления не генерируется.

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

Ответы [ 2 ]

3 голосов
/ 19 июля 2010

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

1 голос
/ 19 июля 2010

Согласно документации для FlushMode по умолчанию Auto:

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

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

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

...