NHibernate FlushMode - Почему NH не может выселить не все сохраненное? - PullRequest
3 голосов
/ 05 марта 2010

Я потратил некоторое время на поиски того, как настроить FlushMode в NHibernate, чтобы он мог сохранять только те объекты, которые я имею в виду, называемые Save / Update / Delete, но я понял, что не могу этого сделать. Вместо этого мне приходится выселять каждый измененный объект (даже без вызова Save / Update / Delete), так как я использую управление транзакциями NHibernate.

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

Я просто хочу, чтобы после фиксации моего сеанса NHibernate вставлял / обновлял / удалял все, что я ему явно требовал, и исключал все остальное. У меня такой вопрос: является ли это поведение просто вопросом «никто не остановился, чтобы реализовать это еще» или есть другие моменты, которые потерпели бы неудачу, если бы существовало такое поведение?

Заранее спасибо.

Филип

Ответы [ 2 ]

4 голосов
/ 06 марта 2010

Nhibernate так не думает. Различие между временными и постоянными объектами, и постоянные объекты синхронизируются с базой данных, когда сеанс сбрасывается (возможно, в другое время). Объекты, которые извлекаются с использованием NH, являются постоянными и будут сохранены при сбросе сеанса без вызова Save (или SaveOrUpdate), поскольку они уже являются постоянными. Существует несколько вариантов управления FlushMode, но нет ничего, что могло бы заставить его работать так, как вы хотите.

Возможный обходной путь может заключаться в извлечении объектов с использованием IStatelessSession и обработке операций через отдельный ISession.

Какую проблему вы пытаетесь решить?

2 голосов
/ 07 марта 2010

Вы в основном спрашиваете: «Почему мой молоток больше не работает как отвертка?»

Вся идея сеанса (помимо прочего) состоит в том, чтобы разрешить автоматическое грязное отслеживание, поэтому вам не нужно беспокоиться о том, что было изменено; только дополнения и не каскадные удаления являются ручными.

Как упоминал Джейми, вы можете использовать IStateLessSession вместо ISession. Он ничего не отслеживает автоматически и не поддерживает отложенную загрузку. Вы должны четко указать, что вставлять, обновлять и удалять. Он больше используется только для чтения и в пакетном режиме, но это, вероятно, то, что вы ищете,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...