Я сталкиваюсь с той же проблемой, что и другие, уже опубликованные на SO: при чтении объектов из базы данных NHibernate обновляет все объекты, поскольку значение одного поля в БД неверно.
(Вдеталь: недавно добавленный столбец даты содержит «1/1/0001» во всех строках, поэтому при отображении NHibernate заменяет дату и, при tx.Commit (), обновляет каждую строку.)
[ Редактировать: Оказалось, что это неправильно. Вместо этого эти поля даты были нулевыми, но NHibernate обновит их до 1 января 0001 года.Подробности см. В ответе Диего.]
Чтобы предотвратить это, я нашел это сообщение с ответом Бена Шейрмана , а также комментарий в блоге , на который ссылаютсяс помощью OP .
Комментатор Кристиан говорит:
Вы также можете отключить автоматическую проверку и обновление, отключив моментальные снимки в Hibernate с помощью session.setReadOnly (o, true) или для всех запрашиваемых объектов с query.setReadOnly (true).
(обратите внимание, что этот блог посвящен Java Hibernate.)
query.SetReadOnly (true) был успешным, гдеЯ использовал запросы.Тем не менее, у меня также есть код, подобный этому:
ISession session = this.NHibernateHelper.SessionFactory.OpenSession();
ITransaction tx = session.BeginTransaction();
try
{
BO resultBO = session.Get<BO>(id);
tx.Commit();
return resultBO;
}
catch (Exception ex)
{
tx.Rollback();
throw ex;
}
finally
{
session.Close();
}
В этом случае у меня нет запроса, и указанный Session.SetReadOnly(resultBO, true)
не существует в NHibernate. Куда это делось?
Полагаю, "evict" в принципе не очень хорошая идея, потому что он делает объект временным, поэтому я не могу использовать его для обновления значений в другом сеансе (по крайней мере,это усложняется. Мне также нужно убедиться, что все объекты всегда исключены, поэтому моим общим методам обновления не нужно было бы различать постоянные и временные объекты - или я совершенно не прав?
Спасибо и ура, chiccodoro